質問するログイン新規登録

回答編集履歴

2

微修正

2020/02/02 01:10

投稿

episteme
episteme

スコア16612

answer CHANGED
@@ -18,8 +18,6 @@
18
18
  long int C_count;
19
19
  long int C(int n, int m);
20
20
 
21
- int calls; /* 呼び出し回数 */
22
-
23
21
  int main(int argc, char *argv[]) {
24
22
  long int n = atoi(argv[1]);
25
23
 

1

追記

2020/02/02 01:10

投稿

episteme
episteme

スコア16612

answer CHANGED
@@ -8,4 +8,58 @@
8
8
  の結果とcall回数を出力しているのでしょうか。
9
9
 
10
10
  であるなら、コマンドラインから与える3つのうち2つは要らないことになります。
11
- nはともかく、mとcの意味が不明です。
11
+ nはともかく、mとcの意味が不明です。
12
+
13
+ ```C
14
+ /* comb.c */
15
+ #include <stdio.h>
16
+ #include <stdlib.h>
17
+
18
+ long int C_count;
19
+ long int C(int n, int m);
20
+
21
+ int calls; /* 呼び出し回数 */
22
+
23
+ int main(int argc, char *argv[]) {
24
+ long int n = atoi(argv[1]);
25
+
26
+ for ( long int m = 0; m <= n; ++m ) {
27
+ C_count = 0; /* 呼び出し回数を0に */
28
+ int result = C(n,m);
29
+ printf("C(%ld,%ld)=%ld[%ld times]\n",n,m,result, C_count);
30
+ }
31
+ return 0;
32
+ }
33
+
34
+ long int C(int n, int m){
35
+ ++C_count; /* ここで呼び出し回数を+1 */
36
+ if( m==0 ) return 1;
37
+ if( m==n ) return 1;
38
+ return C(n-1,m)+C(n-1,m-1);
39
+ }
40
+ ```
41
+
42
+ 入力値はnひとつだけの上記コードで以下の結果を得ました。
43
+
44
+ ```
45
+ D:\work>cl comb.c
46
+ Microsoft(R) C/C++ Optimizing Compiler Version 19.24.28314 for x64
47
+ Copyright (C) Microsoft Corporation. All rights reserved.
48
+
49
+ comb.c
50
+ Microsoft (R) Incremental Linker Version 14.24.28314.0
51
+ Copyright (C) Microsoft Corporation. All rights reserved.
52
+
53
+ /out:comb.exe
54
+ comb.obj
55
+
56
+ D:\work>comb 3
57
+ C(3,0)=1[1 times]
58
+ C(3,1)=3[5 times]
59
+ C(3,2)=3[5 times]
60
+ C(3,3)=1[1 times]
61
+ ```
62
+
63
+ ---
64
+ C(n,m) が nCm を求めているのなら、C(3,0) は m=0 なのでただちに結果1 が求まります。
65
+ なので [2 times] ではなく [1 times] ではなかろうかと。