はじめまして!
c言語初心者ですが、よろしくお願いいたします。
今回は課題の期限が間近に迫ってきているため、投稿させていただきました。
下記の問題について、実行例と実行結果が異なる点があります。
【問題】
フィボナッチ数を計算する関数
long int f(int n)
を再帰呼出しを使って実装したものにトップダウンの動的計画法を適用した場合を考える。与えられた非負整数 n を引数とする関数呼出し f(n) を行なったときに生じる関数呼出し( f 自身の呼出し、および、そこから(直接に/再帰的に)呼び出される関数の呼出し)の回数を数え、 計算されたフィボナッチ数とともにその回数を標準出力に書き出すプログラムを作れ。
プログラムの仕様はつぎの通りとする。
コマンドライン引数に非負整数値が1個または2個与えられる。
1個与えられた場合、その値 n を引数として呼出し f(n) を行う。
2個与えられた場合、それらの値を m1、m2 とすると m 1 ≦ n ≦ m 2 である全ての値 n について小さい方から順に関数呼出し f(n) を行う。 m1>m2 のときは関数呼出しは何も行わずに実行を終了する。
出力は、関数呼出し f(n) を行うごとにその結果をつぎの形式で1行として標準出力に書き出す。
f(n)=v [c times]
v はフィボナッチ数の値、 c はその関数呼出し回数
v と [ の間、c と times の間には、それぞれ空白1文字をおくこと。
【実行例】
コマンドライン入力
0
標準出力
f(0)=0 [2 times]
コマンドライン入力
6 3
標準出力
コマンドライン入力
3 6
標準出力
f(3)=2 [6 times]
f(4)=3 [8 times]
f(5)=5 [10 times]
f(6)=8 [12 times]
上記の問題について、下記のようなコードを作成したのですが、
コマンドラインに、0など値を"1つだけ"入力すると、セグメンテーションフォルトが発生してしまいます。
値が1つだけ与えられた場合や、値が2つ与えられた場合でも、セグメンテーションフォルトを発生させずに値を回すために、どう修正すれば良いのでしょうか。
コード:
#include <stdio.h>
#include <stdlib.h>
long int f(int n);
long int f_c;
long int r;
int main(int argc, char *argv[]){
if(argc==1) return 0;
int i;
int from=atoi(argv[1]);
int to=atoi(argv[2]);
for(i=from; i<=to; i++){
if(i==0){
printf("f(%d)=%ld [%d times]\n",i,f(i),2);
}
if(i>0){
printf("f(%d)=%ld [%d times]\n",i,f(i),i*2);
}
}
return 0;
}
long int f(int n){
f_c++;
if( n<=1 ) return n;
return f(n-1)+f(n-2);
}