#2
by かずま » 7年前
ピオーネ さんが書きました:このコードを元に、と書いてありますが、求め方が全く異なるのに、どういうアルゴリズムにすればよいのでしょうか?
全く異なると言えますか? 異なるのは次の2点だけ。
- 2つ前と 1つ前の和か、2つ前と 3つ前の和か。
- 初期値が 0,1 か、3, 0, 2か。
コードの変更点は、
コード:
4行目
long long f[1000] = { 3, 0, 2 };
9,10行目
if (n <= 2) // 脱出条件 0,1,2なら f[n]を返す
return f[n];
13行目
f1 = fib(n - 3);//再帰1
26行目 (表示を fib から perrin に変えるだけ)
printf( "perrin(%d) = %lld\n", n, f );
27行目 (オーバーフローの検出。元が間違っている)
if (f < 0 )
fib という関数名が残っているのは変なので
コード:
#include <stdio.h>
long long p[1000] = { 3, 0, 2 };
long long per(int n)
{
printf("呼び出し前 n = %d\n", n);
if (n <= 2 || p[n] > 0) return p[n];
return p[n] = per(n - 2) + per(n - 3);
}
int main(void)
{
for (int n = 1; n < 1000; n++) {
long long p = per(n);
printf("perrin(%d) = %lld\n", n, p);
if (p < 0) break;
}
return 0;
}
[quote="ピオーネ" id=3,19711,148492]このコードを元に、と書いてありますが、求め方が全く異なるのに、どういうアルゴリズムにすればよいのでしょうか?[/quote]
全く異なると言えますか? 異なるのは次の2点だけ。
[list]
[*] 2つ前と 1つ前の和か、2つ前と 3つ前の和か。
[*] 初期値が 0,1 か、3, 0, 2か。[/list]
コードの変更点は、
[code]
4行目
long long f[1000] = { 3, 0, 2 };
9,10行目
if (n <= 2) // 脱出条件 0,1,2なら f[n]を返す
return f[n];
13行目
f1 = fib(n - 3);//再帰1
26行目 (表示を fib から perrin に変えるだけ)
printf( "perrin(%d) = %lld\n", n, f );
27行目 (オーバーフローの検出。元が間違っている)
if (f < 0 )
[/code]
fib という関数名が残っているのは変なので
[code=c]
#include <stdio.h>
long long p[1000] = { 3, 0, 2 };
long long per(int n)
{
printf("呼び出し前 n = %d\n", n);
if (n <= 2 || p[n] > 0) return p[n];
return p[n] = per(n - 2) + per(n - 3);
}
int main(void)
{
for (int n = 1; n < 1000; n++) {
long long p = per(n);
printf("perrin(%d) = %lld\n", n, p);
if (p < 0) break;
}
return 0;
}
[/code]