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

回答編集履歴

2

fix small

2021/02/26 18:30

投稿

task4233
task4233

スコア106

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

2021/02/26 18:30

投稿

task4233
task4233

スコア106

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