フィボナッチ数列

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
劉578

フィボナッチ数列

#1

投稿記事 by 劉578 » 3年前

フィボナッチ数列を20項表示したいのですが、printfを関数側で入れる方法がわかりません。main側に入れたらできたので、関数側に入れる方法を教えてほしいです。下のコードでは動きませんでした。

コード:

#include <stdio.h>

int i,n;//グローバル変数

int f(int n)  //フィボナッチ数列を計算する関数
{
	if(n == 0){//2項目を1と表示するため、return0としている
		return 0;
	}
	else if(n == 1){ //1項目の条件
		return 1;
	}

	else{        //2項目以降の条件
		return f(n-1) + f(n-2);
	}

	for(i=1;i<=n;i++){
		printf("%d,\t",f(i));
	}
}

int main()//メイン関数
{
	f(20);

	return 0;
}

Meta3

Re: フィボナッチ数列

#2

投稿記事 by Meta3 » 3年前

>printfを関数側で入れる方法がわかりません
再帰関数のなかに なぜ printf を入れようと思ったのですか? 教えてください
 

// return した後には来ないから無効ですよ
for(i=1;i<=n;i++){
printf("%d,\t",f(i));
}
}

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: フィボナッチ数列

#3

投稿記事 by みけCAT » 3年前

n>=2のとき、n項目を求めるにはn-1項目とn-2項目を使うので、n項目は必ずn-1項目よりも後に求まります。
従って、前に出力した項の次の項が求まった時に出力するといいでしょう。
また、いきなり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で殴ればいい!(死亡フラグ)

Meta3

Re: フィボナッチ数列

#4

投稿記事 by Meta3 » 3年前

スマートにかけるんですね!。なるほど。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>

Meta3

Re: フィボナッチ数列

#5

投稿記事 by Meta3 » 3年前

再帰をやめて 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;
}

Meta3

Re: フィボナッチ数列

#6

投稿記事 by Meta3 » 3年前

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>

返信

“C言語何でも質問掲示板” へ戻る