ID非公開さん
2022/5/24 20:42
1回答
再帰を用いてフィボナッチ数列を計算するとき,第 n 項を計算 するために行う加算の回数を数えるプログラムにおいて#include <stdio.h> int count;
再帰を用いてフィボナッチ数列を計算するとき,第 n 項を計算 するために行う加算の回数を数えるプログラムにおいて#include <stdio.h> int count; long fib(long); void main(void) { long n; for (n=1;n<=20;n++){ printf("%3ld: %ld,加算回数:%d\n",n,fib(n),count); } } long fib(long n) { if (n==1||n==2){ return 1L; } else{ count++; return fib(n-1)+fib(n-2); } } といった上記のコードを作成しましたが出力結果が合いません。出力結果が1: 1, 加算回数:0 2: 1, 加算回数:0 3: 2, 加算回数:1 4: 3, 加算回数:2 5: 5, 加算回数:4 6: 8, 加算回数:7 7: 13, 加算回数:12 8: 21, 加算回数:20 9: 34, 加算回数:33 10: 55, 加算回数:54 11: 89, 加算回数:88 12: 144, 加算回数:143 13: 233, 加算回数:232 14: 377, 加算回数:376 15: 610, 加算回数:609 16: 987, 加算回数:986 17: 1597, 加算回数:1596 18: 2584, 加算回数:2583 19: 4181, 加算回数:4180 20: 6765, 加算回数:6764 となるにはどうしたらよいでしょうか。
ベストアンサー
こんなんでいいかな。 #include <stdio.h> int count; long fib(long); void main(void) { long n; for (n=1;n<=20;n++){ count = 0; printf("%3ld: %ld,加算回数:",n,fib(n)); printf("%d\n",count); } } long fib(long n) { if (n==1||n==2){ return 1L; } else{ count++; return fib(n-1)+fib(n-2); } } とりあえず、count を毎回 0 にしてから加算を始めることと、 count は、fib 関数を呼んだあとに実行させることかな。
printf("%3ld: %ld,加算回数:%d\n",n,fib(n),count); だと、引数は後側から積まれるので、fib を実行する前の count の数値を渡してしまうので。
質問者からのお礼コメント
ありがとうございました!うまくいきました!助かりました
お礼日時:5/25 14:00