再帰の問題が分かりません。
Posted: 2017年11月09日(木) 22:32
現在、再帰を利用した問題を解いています。
p0 = 3, p1 = 0, p2 = 2, pn = pn−2+ pn−3 (n≥3) によって定まる数列 pn をペロン数列という。
前問のフィボナッチ数列のプログラムを元 に、再帰的にペロン数を計算 する関数 perrin(int n )を書き 、main関数でn=3以上で呼び 出し、
下のように値を表示す るプログラムを作成せよ。
perrin(3) = 3
perrin(4) = 2
perrin(5) = 5
perrin(6) = 5
perrin(7) = 7
perrin(8) = 10
perrin(9) = 12
perrin(10) = 17
perrin(11) = 22
perrin(12) = 29
perrin(13) = 39
perrin(14) = 51
perrin(15) = 68
以下が前問で作成したプログラムになります。
このコードを元に、と書いてありますが、求め方が全く異なるのに、どういうアルゴリズムにすればよいのでしょうか?
p0 = 3, p1 = 0, p2 = 2, pn = pn−2+ pn−3 (n≥3) によって定まる数列 pn をペロン数列という。
前問のフィボナッチ数列のプログラムを元 に、再帰的にペロン数を計算 する関数 perrin(int n )を書き 、main関数でn=3以上で呼び 出し、
下のように値を表示す るプログラムを作成せよ。
perrin(3) = 3
perrin(4) = 2
perrin(5) = 5
perrin(6) = 5
perrin(7) = 7
perrin(8) = 10
perrin(9) = 12
perrin(10) = 17
perrin(11) = 22
perrin(12) = 29
perrin(13) = 39
perrin(14) = 51
perrin(15) = 68
以下が前問で作成したプログラムになります。
//前問
#include <stdio.h>
// フィボナッチ数の計算
long long f[1000] = {0};
long long fib( int n )
{
long long f1, f2;
printf( "呼び出し前 n = %d\n", n );
if (n <= 1) // 脱出条件 0なら0 1なら1を返す
return n;
if ( f[n] > 0 )
return f[n];
f1 = fib(n - 1);//再帰1
f2 = fib(n - 2);//再帰2
f[n] = f1 + f2;
return f1 + f2;
}
int main()
{
long long f;
int n;
for ( n = 1; n < 1000; n++ )
{
f = fib(n);
printf( "fib(%d) = %lld\n", n, f );
if ( p < 0 )
break;
}
return 0;
}