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

回答編集履歴

4

変更

2016/10/26 14:37

投稿

A.Ichi
A.Ichi

スコア4070

answer CHANGED
@@ -8,4 +8,88 @@
8
8
 
9
9
  $arg=100;
10
10
  $ttl=sample($arg);
11
+ ```
12
+
13
+
14
+ 「再帰を使って1から指定値までを足し込む」の解説
15
+ ```
16
+ ■概要
17
+ 処理のイメージとしては10段の階段の最上段に居るとします。
18
+ 数字を記入した紙を一段づつ降りながら10,9,8,・・・と書き各階段に置きながら降ります。
19
+ 1段目に来た時 1と書いた紙が置かれます、1段目が来たら戻れとなっているので、
20
+ 今度は逆に紙を拾いつつ上ります。その際に置いて有る紙で足し算しながら登ります。
21
+ 9段目では、紙に書かれた数の合計が45になっています。最後に10段目
22
+ で10を足して55となります。
23
+
24
+
25
+ ■処理の作成
26
+ ・まず階段を降りるロジックを作成します。
27
+
28
+ function sample($arg){
29
+ sample($arg);
30
+ }
31
+ これでは無限に呼び出しを行います(コアダンプする)、リカーシブルなので
32
+ 自分のコピーを呼び出すイメージです。パラメータを添えて
33
+
34
+ ・sample呼ぶ際(下る)にパラメータ$argにマイナス1して渡します。
35
+
36
+ function sample($arg){
37
+ sample($arg - 1);
38
+ }
39
+
40
+ ・これでもまだ無限に下りますので戻りを決めます。(再帰)
41
+  受け取ったargは、呼ばれる毎に1づつ減っています。
42
+  argが1になる時を見つけて戻る事にします。
43
+
44
+ function sample($arg){
45
+ if ($arg <= 1) return;
46
+ sample($arg - 1);
47
+ }
48
+
49
+ ($arg <= 1 としたのは最初から1以下の数字で呼ばれた場合にループしない為)
50
+ これを初期値10として実行すると、リカーシブルにて10個のモジュールがメモリ上に作成されます。
51
+ 各モジュールにはarg(数字)が置かれています。数字を置いた階段の出来上がりです。
52
+
53
+ 1で戻る事にしましたので、arg=1である最後のモジュールから一個づつ戻ります。
54
+ 戻った場所(上記)がモジュールの最終行なのでさらにその上その上と戻り最初のモジュールに
55
+ 戻って終了。リカーシブルの場合、下からどのステップ(位置)に戻るかを意識して作成します。
56
+
57
+ ・足し算するロジックを加えます。
58
+ まずargが1の時の戻り値を1とします。argが1になったモジュールが1を返します。1回だけです。
59
+ 当然sampleの呼び出しはしません。
60
+ 戻り先の上位のモジュール達はsampleの場所で待っています。ifを通り過ぎてsample呼び出しを行った場所で待ちの状態です。
61
+
62
+ function sample($arg){
63
+ if ($arg <= 1) return(1);
64
+ sample($arg - 1);
65
+ }
66
+
67
+ ・上のモジュールに足し算した結果を渡す為にreturnを使います。
68
+
69
+ function sample($arg){
70
+ if ($arg <= 1) return 1;
71
+ return ( sample($arg - 1) );
72
+ }
73
+
74
+ これだと最終結果は1となってしまいますので自分の持っている番号$argを足してから上位に戻ります。
75
+
76
+
77
+ function sample($arg){
78
+ if ($arg <= 1) return 1;
79
+ return ($arg + sample($arg - 1));
80
+ }
81
+
82
+ 戻りは、こんな感じで戻ります。
83
+
84
+ 1 return 1;
85
+ 2 + 1 = 3 retrun ($arg + sample($arg - 1));
86
+ 3 + 3 = 6 以下同様...
87
+ 4 + 6 = 10
88
+ 5 + 10 = 15
89
+ 6 + 15 = 21
90
+ 7 + 21 = 28
91
+ 8 + 28 = 36
92
+ 9 + 36 = 45
93
+ 10 + 45 = 55
94
+
11
95
  ```

3

変更

2016/10/26 14:36

投稿

A.Ichi
A.Ichi

スコア4070

answer CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  ```php
4
4
  function sample($arg){
5
- if($arg == 1) return 1;
5
+ if($arg <= 1) return $arg;
6
6
  return ( $arg + sample($arg-1) );
7
7
  }
8
8
 

2

変更

2016/10/26 13:18

投稿

A.Ichi
A.Ichi

スコア4070

answer CHANGED
@@ -3,8 +3,7 @@
3
3
  ```php
4
4
  function sample($arg){
5
5
  if($arg == 1) return 1;
6
- $n = $arg;
7
- return ( $n + sample(--$arg) );
6
+ return ( $arg + sample($arg-1) );
8
7
  }
9
8
 
10
9
  $arg=100;

1

変更

2016/10/26 10:05

投稿

A.Ichi
A.Ichi

スコア4070

answer CHANGED
@@ -1,4 +1,4 @@
1
- 参加します
1
+ 参加します「再帰」の部分だけですが。
2
2
 
3
3
  ```php
4
4
  function sample($arg){