回答編集履歴
6
リターン0n
test
CHANGED
@@ -28,7 +28,11 @@
|
|
28
28
|
|
29
29
|
↓
|
30
30
|
|
31
|
-
count(4, array, -1) ... ここまで来て、
|
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
てにをは修正
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)までの範囲にある個数
|
93
|
+
**「length までの範囲にある個数は、(length - 1)までの範囲にある個数に、length の位置にある個数(0または1)を足したものである」**と。これが漸化式の考え方であり、再帰関数を作る時の考え方でもあります。例えばこんな感じ
|
94
94
|
|
95
95
|
|
96
96
|
|
@@ -116,7 +116,7 @@
|
|
116
116
|
|
117
117
|
|
118
118
|
|
119
|
-
// 自分の担当
|
119
|
+
// 自分の担当箇所を検査、+1するか否か
|
120
120
|
|
121
121
|
if (array[length] == number)
|
122
122
|
|
4
言い換える→考える
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()の変形と解説を追加
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
遡る過程のリターン値を明記
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
区切りの線を追加
test
CHANGED
@@ -84,7 +84,7 @@
|
|
84
84
|
|
85
85
|
|
86
86
|
|
87
|
-
|
87
|
+
---
|
88
88
|
|
89
89
|
蛇足の感想1.バッファオーバーランするコードが「サンプルコード」とは、いかがなものか。
|
90
90
|
|