回答編集履歴
1
同じことを二回説明しているので削除
test
CHANGED
@@ -28,29 +28,33 @@
|
|
28
28
|
|
29
29
|
|
30
30
|
|
31
|
+
実行中の関数というのはどっかのメモリ領域に保存しなければ、今どの計算してるんだっけ?という状態がわかりませんので、スタックと呼ばれる領域に保存します。
|
32
|
+
|
33
|
+
つまりスタック≒実行中関数
|
34
|
+
|
35
|
+
実行中関数は関数の実行が終了したタイミングでスタックから開放されます。
|
36
|
+
|
37
|
+
|
38
|
+
|
31
39
|
戻り値を返す為に`return 関数実行 + 関数実行`としていますが、
|
32
40
|
|
33
41
|
2つの関数実行が終わり、戻り値を返してくれない事には、この関数は一生実行しっぱなしという事ですね。
|
34
42
|
|
35
|
-
`fib(10000)`みたいなとても大きい数字を入れた場合、大量の関数を実行しまくり、fib(1)の結果を受け取ったfib(3)の計算が終わり、その結果を受け取ったfib(5)の計算が終わり…という流れを繰り替えた後に、fib(10000)の計算がようやく終わります。
|
36
43
|
|
37
44
|
|
45
|
+
`fib(10000)`みたいなとても大きい数字を入れた場合を見ていきます。
|
38
46
|
|
39
|
-
この実行中の関数というのはどっかのメモリ領域に保存しなければ、今どの計算してるんだっけ?という状態がわかりませんので、スタックと呼ばれる領域に保存します。
|
40
|
-
|
41
|
-
つまりスタック≒実行中関数
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
実行中関数は関数実行を閉じるとスタックから開放されます。
|
46
|
-
|
47
|
-
|
47
|
+
fib(10000)はfib(9999)とfib(9998)の実行が終わるまでは終了しないぞと言っています。
|
48
48
|
|
49
49
|
作られたfib(9999)もfib(9998)とfib(9997)の実行が終わるまでは終了しないぞと言っています。
|
50
50
|
|
51
51
|
この調子で関数実行がネストすれば、外側の関数はずっと実行しっぱなし…最終的にブラウザが用意してるスタック領域は全て消費しつくしてもう保存出来なくなってしまいます。
|
52
52
|
|
53
|
+
|
54
|
+
|
55
|
+
この用意しているスタック数というのはブラウザによって数が違うのですが、だいたい数千〜数万です。
|
56
|
+
|
53
|
-
スタック
|
57
|
+
なので、今回のfib(10000)を実行すれば大抵どのブラウザでもスタックオーバーフローのエラーが出ます。
|
54
58
|
|
55
59
|
|
56
60
|
|