フィボナッチ数列を20項表示したいのですが、printfを関数側で入れる方法がわかりません。main側に入れたらできたので、関数側に入れる方法を教えてほしいです。下のコードでは動きませんでした。
フィボナッチ数列
Re: フィボナッチ数列
>printfを関数側で入れる方法がわかりません
再帰関数のなかに なぜ printf を入れようと思ったのですか? 教えてください
// return した後には来ないから無効ですよ
for(i=1;i<=n;i++){
printf("%d,\t",f(i));
}
}
再帰関数のなかに なぜ printf を入れようと思ったのですか? 教えてください
// return した後には来ないから無効ですよ
for(i=1;i<=n;i++){
printf("%d,\t",f(i));
}
}
Re: フィボナッチ数列
n>=2のとき、n項目を求めるにはn-1項目とn-2項目を使うので、n項目は必ずn-1項目よりも後に求まります。
従って、前に出力した項の次の項が求まった時に出力するといいでしょう。
また、いきなりreturnするのではなく、一旦結果をresultに格納して後で処理できるようにしました。
従って、前に出力した項の次の項が求まった時に出力するといいでしょう。
また、いきなりreturnするのではなく、一旦結果をresultに格納して後で処理できるようにしました。
#include <stdio.h>
int lastN = 0;//グローバル変数
int f(int n) //フィボナッチ数列を計算する関数
{
int result;
if(n == 0){//2項目を1と表示するため、return0としている
result = 0;
}
else if(n == 1){ //1項目の条件
result = 1;
}
else{ //2項目以降の条件
result = f(n-1) + f(n-2);
}
if (n == lastN + 1) {
printf("%d,\t", result);
lastN = n;
}
return result;
}
int main()//メイン関数
{
f(20);
return 0;
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: フィボナッチ数列
スマートにかけるんですね!。なるほど。VisualStudio2019で実行してみました
c:\b>cl c1.c
Microsoft(R) C/C++ Optimizing Compiler Version 19.28.29335 for x86
Copyright (C) Microsoft Corporation. All rights reserved.
c1.c
Microsoft (R) Incremental Linker Version 14.28.29335.0
Copyright (C) Microsoft Corporation. All rights reserved.
/out:c1.exe
c1.obj
c:\b>c1.exe
1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610,
987, 1597, 2584, 4181, 6765,
c:\b>
Re: フィボナッチ数列
再帰をやめて for 文で計算する。0から表示
#include <stdio.h>
int f(int n) //フィボナッチ数列を計算する関数
{
/* 変数の宣言 */
int f0, f1, f2;
f0 = 0;
f1 = 1;
/* フィボナッチ数(n=0)の出力 */
printf("%d\n", f0);
/* フィボナッチ数の計算 */
for(int i=1; i<=n; i++) {
// フィボナッチ数の出力(n>0)
printf("%d\t", f1);
// フィボナッチ数の計算
f2 = f1 + f0;
// 変数の代入
f0 = f1;
f1 = f2;
}
return 0;
}
int main()//メイン関数
{
f(20);
return 0;
}
Re: フィボナッチ数列
VisualStudio2019で実行
c:\b>cl c1.c
Microsoft(R) C/C++ Optimizing Compiler Version 19.28.29335 for x86
Copyright (C) Microsoft Corporation. All rights reserved.
c1.c
Microsoft (R) Incremental Linker Version 14.28.29335.0
Copyright (C) Microsoft Corporation. All rights reserved.
/out:c1.exe
c1.obj
c:\b>c1.exe
0
1 1 2 3 5 8 13 21 34 55 89 144 233 377 610
987 1597 2584 4181 6765
c:\b>