- ベストアンサー
再起処理について
- クリティカルパス長の値が1以外の値になっているのが分かりません。
- 後続タスクにはFFGGGIJJLLMPPPQQを入力してください。
- 再起処理を使ってクリティカルパスの長さを求める関数が実装されています。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
> printf("3?n"); > return(critical_path(ary[SUCC][i] - 'A', ary) + 1); > printf("4?n"); 再帰呼び出しの結果をそのまま返してるので、4番にいかないですね。 int ret; printf("3?n"); ret = (critical_path(ary[SUCC][i] - 'A', ary) + 1); printf("4 %d?n", ret); return ret; こうすれば、再帰呼び出しの結果が出力されるので、わかりやすいと思いますよ。
その他の回答 (1)
- cherry_moon
- ベストアンサー率36% (37/102)
>クリティカルパス長の値が1以外の値になっているのが分かりません。 elseのときに1以外の値を返しているからです。 もっとシンプルな例で動作をみるとわかりやすいんじゃないでしょうか。 #include <stdio.h> int recursive_call_test ( int x ) { int y; if ( x<=1 ) { return 1; } else { y = recursive_call_test(x-1) + x; printf(" %d %2d?n", x, y); return y; } } int main ( int argc, char** argv ) { int x; for ( x=1; x<10; x++ ) { printf("%d: %2d?n", x, recursive_call_test(x)); } return 0; }
補足
回答ありがとうございます。 上記サンプルは理解できましたが、私のソースの方がまだ理解できない次第です。 上記サンプルを私が理解しやすいように変更しました。 下記ソース #include <stdio.h> int recursive_call_test ( int x ) { int y; printf("1\n"); if ( x<=1 ) { printf("return\n"); return 1; } else { printf("2\n"); y = recursive_call_test(x-1) + x; printf("%d:%d?a\n", x, y); return y; } } int main ( int argc, char** argv ) { int x; for ( x=1; x<10; x++ ) { printf("%d:%d?b\n", x, recursive_call_test(x)); } return 0; } (実行結果) 1 return 1:1?b 1 2 1 return 2:3?a 2:3?b この場合retrun yで返っている値が3ということが分かります。なので2:3?bの3という値は納得できます。 (私のソースです) int critical_path(int i, int ary[][TASK]) { printf("i = %d\n", i); printf("1\n"); if((char)ary[SUCC][i] == '@'){ printf("2\n"); printf("return \n"); return(1); } else{ printf("3\n"); return(critical_path(ary[SUCC][i] - 'A', ary) + 1); printf("4\n"); } } (実行結果) 後続タスクの入力(ないものは'@') タスク : ABCDEFGHIJKLMNOPQ 後続タスク : FFGGGIJJLLMPPPQQ@ i = 0 1 3 i = 5 1 3 i = 8 1 3 i = 11 1 3 i = 15 1 3 i = 16 1 2 return tbl[PATH][i] = 6 この場合return(1);で処理が終わっています。 なのでこの1が6に成るのが分からない次第です。 回答のほど宜しくお願いいたします。
お礼
どうもご親切にありがとうございます。 おかげでスッキリと理解することが出来ました。