Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > рекурсия вроде


Автор: Vicipi 16.1.2009, 22:19
как это сделать?(С++)
формирование двоичной псевдослучайной последовательности {φi} с помощью алгоритма φi = (φi-8 + φi-4 + φi-3 + φi-2) mod 2, φ0=1, φi=0 для i<0;     i - 96 штук 

Автор: pan2004 16.1.2009, 22:35
Цитата(Vicipi @  16.1.2009,  22:19 Найти цитируемый пост)
как это сделать?

написать функцию int fi(int index), реализующая указанный алгоритм(надеюсь, в математических понятиях и символах разбираешься). Функция возвращает index-ный элемент последовательности (0 или 1). mod 2 на C будет %2.

Автор: Vicipi 16.1.2009, 22:39
это я понимаю, меня смущает φi=0 для i<0, как сделать проверку?

Автор: pan2004 16.1.2009, 22:42
Цитата(Vicipi @  16.1.2009,  22:39 Найти цитируемый пост)
меня смущает φi=0 для i<0

чем?
Цитата(Vicipi @  16.1.2009,  22:39 Найти цитируемый пост)
как сделать проверку?

так же как и остальные, через if:
Код

if (index < 0) return 0;

Автор: Vicipi 16.1.2009, 22:50
не пойму я как этот алгоритм записать, можешь код привести 

Автор: pan2004 16.1.2009, 22:58
пример вычисление чисел фиббоначчи:
Код

int fib(int index)
{
   if (index <= 2) return 1;
   return fib(index-1) + fib(index-2);
} 

твоя функция делается аналогично.

Автор: Lamak 17.1.2009, 00:09
вот код, без какой-либо рекурсии
Код

#include "iostream"

using namespace std;

//φi = (φi-8 + φi-4 + φi-3 + φi-2) mod 2, φ0=1, φi=0 для i<0;     i - 96 

const int n=96;
long fi[n];

long get_fi(int i)
{
    if(i<0)
        return 0;
    else
        return fi[i];
}

long find_fi()
{
    for(int i=2;i<n;i++)
    {
        fi[i]=(fi[i-8]+fi[i-4]+fi[i-3]+fi[i-2])%2;
    }
    return fi[n-1];
}

void main()
{
    fi[0]=1;
    cout<<"f"<<n-1<<"="<<find_fi()<<endl;
    system("pause");
}

только проверь условие, потому как получается ряд состоящий из одних нулей  

Автор: Vicipi 17.1.2009, 07:40
я вот так записал, только почему не возвращает se[i] в функции, как это исправить?
Код

int fi(int i)
{
      if(i<0)
        return 0;
    else
        return se[i];

}  

int se[96]={1,0};
     cout << se[0];
    for(i=1;i<96;i++)
   { se[i]=(fi(i-8)+fi(i-4)+fi(i-3)+fi(i-2))%2;
       cout << se[i];}
    

Автор: mes 17.1.2009, 12:22
Цитата(Lamak @  16.1.2009,  23:09 Найти цитируемый пост)
    for(int i=2;i<n;i++)
    {
        fi[i]=(fi[i-8]+fi[i-4]+fi[i-3]+fi[i-2])%2;

тут выход за границу (забыто get_)

Автор: pan2004 17.1.2009, 12:23
Цитата(Lamak @  17.1.2009,  00:09 Найти цитируемый пост)
только проверь условие, потому как получается ряд состоящий из одних нулей

get_fi() есть, но не используется. find_fi смотрит за пределы массива.
Цитата(Vicipi @  17.1.2009,  07:40 Найти цитируемый пост)
 почему не возвращает se[i] в функции, как это исправить?

да что то у тебя функции вообще не видно, кроме fi(...)
а для возврата есть оператор return.
return se[i];

Автор: mes 17.1.2009, 12:29
вот вариация вышепредставленного варианта с предрасчетом :
Код

int fi_[96]={1,0};

int fi(int i)
{
    return (i<0) ? 0 : fi_[i];
}

void fi_init ()
{
     for(int i=1;i<96;i++) fi_[i]=(fi(i-8)+fi(i-4)+fi(i-3)+fi(i-2))%2;
}

int main()
{
   fi_init();

   for(int i=1;i<96;i++) std::cout<<fi(i) << " ";

   system("pause");
    return 0;
}

Автор: Lamak 17.1.2009, 17:55
дам ступил
видно очень уж сонным был smile 
вот исправил  smile 
Код

#include "iostream"

using namespace std;

//φi = (φi-8 + φi-4 + φi-3 + φi-2) mod 2, φ0=1, φi=0 для i<0;     i - 96 

const int n=96;
long fi[n];

long get_fi(int i)
{
    if(i<0)
        return 0;
    else
        return fi[i];
}

void find_fi()
{
    for(int i=1;i<n;i++)
    {
        fi[i]=(get_fi(i-8)+get_fi(i-4)+get_fi(i-3)+get_fi(i-2))%2;
    }
}

void main()
{
    fi[0]=1;
    find_fi();
    for(int i=1; i<96; i++) 
    {
        cout<<fi[i]<<" ";
    }
    cout<<endl;
    system("pause");
}

Автор: Vicipi 17.1.2009, 22:16
ок, спасибо всем)))

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)