回答編集履歴
2
fix small
answer
CHANGED
@@ -25,7 +25,7 @@
|
|
25
25
|
|
26
26
|
> その後、処理が止まっていた再帰の処理が新しい順から始まる
|
27
27
|
|
28
|
-
「新しい順から」という言葉を明確にすると、「2のノードの`array = tree.Left.InOrderTraverse(array)`の代入が実行される」です。
|
28
|
+
「新しい順から始まる」という言葉を明確にすると、「2のノードの`array = tree.Left.InOrderTraverse(array)`の代入が実行される」です。
|
29
29
|
|
30
30
|
## huskiesさんの質問について
|
31
31
|
下記の加算結果を代入するコードが実行される時を考えます。
|
@@ -196,4 +196,6 @@
|
|
196
196
|
// [1 2 6 5 10 15 22]
|
197
197
|
```
|
198
198
|
|
199
|
+
要点だけを話したので、更に詳しく知りたい場合は「関数 呼び出し 仕組み」や「再帰 スタックメモリ」などで調べると良いと思います。ここら辺はコンピュータサイエンスの分野になるので、「実行できれば良い」というスタンスなら別に知る必要はないと思います。
|
200
|
+
|
199
201
|
長くなりましたが、プログラムが実行される時にどのように実行されるかを理解するのは非常に重要で為になります。引き続き頑張ってください。
|
1
fix small
answer
CHANGED
@@ -2,12 +2,14 @@
|
|
2
2
|
|
3
3
|
## huskiesさんの理解について
|
4
4
|
> 例えば、まず`if tree.Left != nil`を通してnodeを1まで進め(リーフノード)、そのループ時はnilとなるので`append`される
|
5
|
+
|
5
6
|
不明瞭なので、書き直すと下記の通りです。
|
6
7
|
|
7
8
|
`if tree.Left != nil`を通して、10, 5, 2のノードにおいて`tree.Left.InOrderTraverse(array)`が呼び出され、最終的に1のノードで`tree.Left`がnilになるので、`array = append(array, tree.Value)`が実行される。**ここで重要なのは、10, 5, 2のノードでの呼び出しはリターンされず、スタックに積まれたままである(実行中)ということです。そのため、1のノードの実行が終了してもその後2のノードが引き続き実行されます。**
|
8
9
|
|
9
10
|
したがって、その後の記述で、
|
10
11
|
> 関数が終了してしまうのでは
|
12
|
+
|
11
13
|
と書かれていますが、1のノードに生えているメソッドInOrderTraverseについて、この理解は正しいです。
|
12
14
|
(本質ではないですが、InOrderTraverseはレシーバに生えているので**関数ではなくメソッド**です。)
|
13
15
|
|