回答編集履歴

4

変更

2016/10/26 14:37

投稿

A.Ichi
A.Ichi

スコア4070

test CHANGED
@@ -19,3 +19,171 @@
19
19
  $ttl=sample($arg);
20
20
 
21
21
  ```
22
+
23
+
24
+
25
+
26
+
27
+ 「再帰を使って1から指定値までを足し込む」の解説
28
+
29
+ ```
30
+
31
+ ■概要
32
+
33
+ 処理のイメージとしては10段の階段の最上段に居るとします。
34
+
35
+ 数字を記入した紙を一段づつ降りながら10,9,8,・・・と書き各階段に置きながら降ります。
36
+
37
+ 1段目に来た時 1と書いた紙が置かれます、1段目が来たら戻れとなっているので、
38
+
39
+ 今度は逆に紙を拾いつつ上ります。その際に置いて有る紙で足し算しながら登ります。
40
+
41
+ 9段目では、紙に書かれた数の合計が45になっています。最後に10段目
42
+
43
+ で10を足して55となります。
44
+
45
+
46
+
47
+
48
+
49
+ ■処理の作成
50
+
51
+ ・まず階段を降りるロジックを作成します。
52
+
53
+
54
+
55
+ function sample($arg){
56
+
57
+ sample($arg);
58
+
59
+ }
60
+
61
+ これでは無限に呼び出しを行います(コアダンプする)、リカーシブルなので
62
+
63
+ 自分のコピーを呼び出すイメージです。パラメータを添えて
64
+
65
+
66
+
67
+ ・sample呼ぶ際(下る)にパラメータ$argにマイナス1して渡します。
68
+
69
+
70
+
71
+ function sample($arg){
72
+
73
+ sample($arg - 1);
74
+
75
+ }
76
+
77
+
78
+
79
+ ・これでもまだ無限に下りますので戻りを決めます。(再帰)
80
+
81
+  受け取ったargは、呼ばれる毎に1づつ減っています。
82
+
83
+  argが1になる時を見つけて戻る事にします。
84
+
85
+
86
+
87
+ function sample($arg){
88
+
89
+ if ($arg <= 1) return;
90
+
91
+ sample($arg - 1);
92
+
93
+ }
94
+
95
+
96
+
97
+ ($arg <= 1 としたのは最初から1以下の数字で呼ばれた場合にループしない為)
98
+
99
+ これを初期値10として実行すると、リカーシブルにて10個のモジュールがメモリ上に作成されます。
100
+
101
+ 各モジュールにはarg(数字)が置かれています。数字を置いた階段の出来上がりです。
102
+
103
+
104
+
105
+ 1で戻る事にしましたので、arg=1である最後のモジュールから一個づつ戻ります。
106
+
107
+ 戻った場所(上記)がモジュールの最終行なのでさらにその上その上と戻り最初のモジュールに
108
+
109
+ 戻って終了。リカーシブルの場合、下からどのステップ(位置)に戻るかを意識して作成します。
110
+
111
+
112
+
113
+ ・足し算するロジックを加えます。
114
+
115
+ まずargが1の時の戻り値を1とします。argが1になったモジュールが1を返します。1回だけです。
116
+
117
+ 当然sampleの呼び出しはしません。
118
+
119
+ 戻り先の上位のモジュール達はsampleの場所で待っています。ifを通り過ぎてsample呼び出しを行った場所で待ちの状態です。
120
+
121
+
122
+
123
+ function sample($arg){
124
+
125
+ if ($arg <= 1) return(1);
126
+
127
+ sample($arg - 1);
128
+
129
+ }
130
+
131
+
132
+
133
+ ・上のモジュールに足し算した結果を渡す為にreturnを使います。
134
+
135
+
136
+
137
+ function sample($arg){
138
+
139
+ if ($arg <= 1) return 1;
140
+
141
+ return ( sample($arg - 1) );
142
+
143
+ }
144
+
145
+
146
+
147
+ これだと最終結果は1となってしまいますので自分の持っている番号$argを足してから上位に戻ります。
148
+
149
+
150
+
151
+
152
+
153
+ function sample($arg){
154
+
155
+ if ($arg <= 1) return 1;
156
+
157
+ return ($arg + sample($arg - 1));
158
+
159
+ }
160
+
161
+
162
+
163
+ 戻りは、こんな感じで戻ります。
164
+
165
+
166
+
167
+ 1 return 1;
168
+
169
+ 2 + 1 = 3 retrun ($arg + sample($arg - 1));
170
+
171
+ 3 + 3 = 6 以下同様...
172
+
173
+ 4 + 6 = 10
174
+
175
+ 5 + 10 = 15
176
+
177
+ 6 + 15 = 21
178
+
179
+ 7 + 21 = 28
180
+
181
+ 8 + 28 = 36
182
+
183
+ 9 + 36 = 45
184
+
185
+ 10 + 45 = 55
186
+
187
+
188
+
189
+ ```

3

変更

2016/10/26 14:36

投稿

A.Ichi
A.Ichi

スコア4070

test CHANGED
@@ -6,7 +6,7 @@
6
6
 
7
7
  function sample($arg){
8
8
 
9
- if($arg == 1) return 1;
9
+ if($arg <= 1) return $arg;
10
10
 
11
11
  return ( $arg + sample($arg-1) );
12
12
 

2

変更

2016/10/26 13:18

投稿

A.Ichi
A.Ichi

スコア4070

test CHANGED
@@ -8,9 +8,7 @@
8
8
 
9
9
  if($arg == 1) return 1;
10
10
 
11
- $n = $arg;
12
-
13
- return ( $n + sample(--$arg) );
11
+ return ( $arg + sample($arg-1) );
14
12
 
15
13
  }
16
14
 

1

変更

2016/10/26 10:05

投稿

A.Ichi
A.Ichi

スコア4070

test CHANGED
@@ -1,4 +1,4 @@
1
- 参加します
1
+ 参加します「再帰」の部分だけですが。
2
2
 
3
3
 
4
4