回答編集履歴

6

リターン0n

2018/08/13 09:33

投稿

rubato6809
rubato6809

スコア1380

test CHANGED
@@ -28,7 +28,11 @@
28
28
 
29
29
 
30
30
 
31
- count(4, array, -1) ... ここまで来て、に return 0; する
31
+ count(4, array, -1) ... ここまで来て、終了条件より return 0; する
32
+
33
+
34
+
35
+ 念の為:終了条件とは count() 関数の ``` if (length == -1) ``` です。
32
36
 
33
37
 
34
38
 
@@ -154,4 +158,4 @@
154
158
 
155
159
  ```
156
160
 
157
- 階乗の例を学んだら、次はハノイの塔かクイックソート辺りに進むのが良いのでは、と思います。
161
+ 階乗の例を学んだら、次はハノイの塔かクイックソート辺りに進むのが良いのでは、と思います。こういう問題はループで書くのが大変面倒です。

5

てにをは修正

2018/08/13 09:33

投稿

rubato6809
rubato6809

スコア1380

test CHANGED
@@ -90,7 +90,7 @@
90
90
 
91
91
  int count(int number, int array[], int length) 関数は、**array[0]からarray[length]にある number の個数を返す関数**です。それは、こう考えることもできます。
92
92
 
93
- **「length までの範囲にある個数は、(length - 1)までの範囲にある個数、length の位置にある個数(0または1)を足したものである」**と。これが漸化式の考え方であり、再帰関数を作る時の考え方でもあります。例えばこんな感じ
93
+ **「length までの範囲にある個数は、(length - 1)までの範囲にある個数、length の位置にある個数(0または1)を足したものである」**と。これが漸化式の考え方であり、再帰関数を作る時の考え方でもあります。例えばこんな感じ
94
94
 
95
95
 
96
96
 
@@ -116,7 +116,7 @@
116
116
 
117
117
 
118
118
 
119
- // 自分の担当部分を検査、+1するか否か
119
+ // 自分の担当箇所を検査、+1するか否か
120
120
 
121
121
  if (array[length] == number)
122
122
 

4

言い換える→考える

2018/08/12 21:43

投稿

rubato6809
rubato6809

スコア1380

test CHANGED
@@ -88,7 +88,7 @@
88
88
 
89
89
 
90
90
 
91
- int count(int number, int array[], int length) 関数は、**array[0]からarray[length]にある number の個数を返す関数**です。それは、こう言い換えることできます。
91
+ int count(int number, int array[], int length) 関数は、**array[0]からarray[length]にある number の個数を返す関数**です。それは、こうえることできます。
92
92
 
93
93
  **「length までの範囲にある個数は、(length - 1)までの範囲にある個数と、length の位置にある個数(0または1)を足したものである」**と。これが漸化式の考え方であり、再帰関数を作る時の考え方でもあります。例えばこんな感じ
94
94
 

3

count()の変形と解説を追加

2018/08/12 21:39

投稿

rubato6809
rubato6809

スコア1380

test CHANGED
@@ -86,6 +86,50 @@
86
86
 
87
87
  ---
88
88
 
89
+
90
+
91
+ int count(int number, int array[], int length) 関数は、**array[0]からarray[length]にある number の個数を返す関数**です。それは、こう言い換えることができます。
92
+
93
+ **「length までの範囲にある個数は、(length - 1)までの範囲にある個数と、length の位置にある個数(0または1)を足したものである」**と。これが漸化式の考え方であり、再帰関数を作る時の考え方でもあります。例えばこんな感じ
94
+
95
+
96
+
97
+ - count(4, array, 16) == count(4, array, 15) + array[16]が4に等しいか否か
98
+
99
+
100
+
101
+ 提示されたcount()は、中にcount()呼出しが2箇所ありますが、一箇所にすることもできます。
102
+
103
+ ```C
104
+
105
+ int count(int number, int array[], int length)
106
+
107
+ {
108
+
109
+ if (length == -1) return 0; // これ以上掘っても number は無い(終了条件)
110
+
111
+
112
+
113
+ // length - 1、即ちひとつ下までの個数を得るため、ここで再帰する
114
+
115
+ int result = count(number, array, length - 1);
116
+
117
+
118
+
119
+ // 自分の担当部分を検査、+1するか否か
120
+
121
+ if (array[length] == number)
122
+
123
+ ++result;
124
+
125
+ return result; // length 位置までの結果を返す
126
+
127
+ }
128
+
129
+ ```
130
+
131
+ ---
132
+
89
133
  蛇足の感想1.バッファオーバーランするコードが「サンプルコード」とは、いかがなものか。
90
134
 
91
135
 

2

遡る過程のリターン値を明記

2018/08/12 21:27

投稿

rubato6809
rubato6809

スコア1380

test CHANGED
@@ -52,7 +52,7 @@
52
52
 
53
53
 
54
54
 
55
- count(4, array, 16) ・・・そのままリターン(多分 array[16] != 4 )
55
+ count(4, array, 16) ・・・そのまま2をリターン(多分 array[16] != 4 )
56
56
 
57
57
 
58
58
 
@@ -60,7 +60,7 @@
60
60
 
61
61
 
62
62
 
63
- count(4, array, 14) ・・・そのままリターン
63
+ count(4, array, 14) ・・・そのまま1をリターン
64
64
 
65
65
 
66
66
 
@@ -68,11 +68,11 @@
68
68
 
69
69
 
70
70
 
71
- count(4, array, 2) ・・・そのままリターン
71
+ count(4, array, 2) ・・・そのまま0をリターン
72
72
 
73
- count(4, array, 1) ・・・そのままリターン
73
+ count(4, array, 1) ・・・そのまま0をリターン
74
74
 
75
- count(4, array, 0) ・・・そのままリターン
75
+ count(4, array, 0) ・・・そのまま0をリターン
76
76
 
77
77
 
78
78
 

1

区切りの線を追加

2018/08/12 20:35

投稿

rubato6809
rubato6809

スコア1380

test CHANGED
@@ -84,7 +84,7 @@
84
84
 
85
85
 
86
86
 
87
-
87
+ ---
88
88
 
89
89
  蛇足の感想1.バッファオーバーランするコードが「サンプルコード」とは、いかがなものか。
90
90