回答編集履歴

1

イメージをコードっぽく記載

2021/04/25 15:24

投稿

hoshito
hoshito

スコア107

test CHANGED
@@ -53,3 +53,185 @@
53
53
 
54
54
 
55
55
  なので `nの階乗(5)` を呼び出すと結果として`120`が返ってくるわけです。
56
+
57
+
58
+
59
+ -----------
60
+
61
+
62
+
63
+ (追記) 最初に書いたイメージをコードっぽく書いてみますね。
64
+
65
+
66
+
67
+ もとのFunctionは下のような形でした。
68
+
69
+ ```
70
+
71
+ Function nの階乗(n As Long) As Variant
72
+
73
+ If n = 1 Then
74
+
75
+ nの階乗 = 1
76
+
77
+ Else
78
+
79
+ nの階乗 = n * nの階乗(n - 1)
80
+
81
+ End If
82
+
83
+ Debug.Print n & "の階乗は" & nの階乗
84
+
85
+ End Function
86
+
87
+ ```
88
+
89
+
90
+
91
+ 例として`n = 2`のときは下のようになります。
92
+
93
+ ```
94
+
95
+ n = 2
96
+
97
+ If n = 1 Then
98
+
99
+ // ここには入らない
100
+
101
+ nの階乗 = 1
102
+
103
+ Else
104
+
105
+ // ここに入る
106
+
107
+ nの階乗 = n * nの階乗(n - 1)
108
+
109
+ End If
110
+
111
+ Debug.Print n & "の階乗は" & nの階乗
112
+
113
+ ```
114
+
115
+
116
+
117
+ このとき`nの階乗(n - 1)`の部分をバラして書くと下のようになります。
118
+
119
+ ```
120
+
121
+ n = 2
122
+
123
+ If n = 1 Then
124
+
125
+ // ここには入らない
126
+
127
+ nの階乗 = 1
128
+
129
+ Else
130
+
131
+ // ここに入る
132
+
133
+ nの階乗 = n * {
134
+
135
+ // nの階乗(1)の処理
136
+
137
+ n' = 1
138
+
139
+ If n' = 1 Then
140
+
141
+ // ここに入る
142
+
143
+ n'の階乗 = 1
144
+
145
+ Else
146
+
147
+ // ここには入らない
148
+
149
+ n'の階乗 = n' * nの階乗(n' - 1)
150
+
151
+ End If
152
+
153
+ Debug.Print n' & "の階乗は" & n'の階乗 // ここで「1の階乗は1」と出る
154
+
155
+ } // {}の中身は n'の階乗 つまり 1 になる
156
+
157
+ End If
158
+
159
+ Debug.Print n & "の階乗は" & nの階乗 // ここで「2の階乗は2」と出る
160
+
161
+ ```
162
+
163
+ もちろんこのコードは文法が誤っているので動かないのですが、気持ちとしては上のようなコードが走っているわけです。
164
+
165
+
166
+
167
+
168
+
169
+ `n = 3`のときはこうです。
170
+
171
+ ```
172
+
173
+ n = 3
174
+
175
+ If n = 1 Then
176
+
177
+ // ここには入らない
178
+
179
+ nの階乗 = 1
180
+
181
+ Else
182
+
183
+ // ここに入る
184
+
185
+ nの階乗 = n * {
186
+
187
+ // nの階乗(2)の処理
188
+
189
+ n' = 2
190
+
191
+ If n' = 1 Then
192
+
193
+ // ここには入らない
194
+
195
+ n'の階乗 = 1
196
+
197
+ Else
198
+
199
+ // ここに入る
200
+
201
+ n'の階乗 = n' * {
202
+
203
+ // nの階乗(1)の処理
204
+
205
+ n'' = 1
206
+
207
+ If n'' = 1 Then
208
+
209
+ // ここに入る
210
+
211
+ n''の階乗 = 1
212
+
213
+ Else
214
+
215
+ // ここには入らない
216
+
217
+ n''の階乗 = n'' * nの階乗(n'' - 1)
218
+
219
+ End If
220
+
221
+ Debug.Print n'' & "の階乗は" & n''の階乗 // ここで「1の階乗は1」と出る
222
+
223
+ } // {}の中身は n''の階乗 つまり 1 になる
224
+
225
+ End If
226
+
227
+ Debug.Print n' & "の階乗は" & n'の階乗 // ここで「2の階乗は2」と出る
228
+
229
+ } // {}の中身は n'の階乗 つまり 2 になる
230
+
231
+ End If
232
+
233
+ Debug.Print n & "の階乗は" & nの階乗 // ここで「3の階乗は6」と出る
234
+
235
+ ```
236
+
237
+ nが大きくなると入れ子が増えるため書くのが大変になりますが同じように動きます。