回答編集履歴
4
コード修正
answer
CHANGED
@@ -4,7 +4,7 @@
|
|
4
4
|
> このコードでpopメソッドとappendメソッドがどういう役割を果たしているのかもわからないです。
|
5
5
|
|
6
6
|
~~「再帰」から「ループ」へと実装方式の切り替えにおける、~~
|
7
|
-
再帰呼び出しでの「スタックの役割」を果たします。
|
7
|
+
~~再帰~~ 関数呼び出しでの「スタックの役割」を果たします。
|
8
8
|
|
9
9
|
- 前提: データ構造としてのスタック
|
10
10
|
FILO (first-in-last-out) の PUSH と POP が list の append, pop
|
@@ -73,6 +73,6 @@
|
|
73
73
|
|
74
74
|
if __name__ == '__main__':
|
75
75
|
top = Node(1, Node(2, Node(3, None)))
|
76
|
-
print(
|
76
|
+
print(search_recursive(top, 2))
|
77
77
|
print(search_loop(top, 2))
|
78
78
|
```
|
3
勘違いがあった点を修正
answer
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
|
4
4
|
> このコードでpopメソッドとappendメソッドがどういう役割を果たしているのかもわからないです。
|
5
5
|
|
6
|
-
|
6
|
+
~~「再帰」から「ループ」へと実装方式の切り替えにおける、~~
|
7
7
|
再帰呼び出しでの「スタックの役割」を果たします。
|
8
8
|
|
9
9
|
- 前提: データ構造としてのスタック
|
@@ -29,4 +29,50 @@
|
|
29
29
|
|
30
30
|
嚙み砕いて説明すると、
|
31
31
|
再帰呼び出しの時に処理系内部で行われてるような「スタック操作」を、
|
32
|
-
独自にリストとループ処理で行う事で、再帰呼び出しを模倣しています。
|
32
|
+
独自にリストとループ処理で行う事で、再帰呼び出しを模倣 ~~しています。~~ 出来るようになります。
|
33
|
+
|
34
|
+
追記1:
|
35
|
+
- 現状のコードでは、スタックは直ぐに消化されているので、
|
36
|
+
再帰呼び出しを模倣しているわけではありません。
|
37
|
+
- 関数内での関数呼び出しを実装する時にスタックが必要になります。
|
38
|
+
|
39
|
+
追記2: 「再帰」から「ループ」へと実装方式の切り替えに関して
|
40
|
+
|
41
|
+
「連結リスト」のデータ構造の理解が学習のヒントです。
|
42
|
+
|
43
|
+
- 再帰では、引数を変えて同じ関数を実行します。
|
44
|
+
- ループで、引数を変えて同じ処理を実行に書き換え可能。
|
45
|
+
|
46
|
+
|
47
|
+
```python
|
48
|
+
class Node:
|
49
|
+
"""
|
50
|
+
Sample data:
|
51
|
+
+---------+--------+ +---------+--------+ +---------+------------+
|
52
|
+
| data: 1 | next: --> | data: 2 | next: --> | data: 3 | next: None |
|
53
|
+
+---------+--------+ +---------+--------+ +---------+------------+
|
54
|
+
"""
|
55
|
+
def __init__(self, data, next_node=None):
|
56
|
+
self.data = data
|
57
|
+
self.next = next_node
|
58
|
+
|
59
|
+
def __repr__(self):
|
60
|
+
return f"<Node data={self.data}>"
|
61
|
+
|
62
|
+
def search_recursive(node, value):
|
63
|
+
if node.data == value:
|
64
|
+
return node
|
65
|
+
else:
|
66
|
+
return search_recursive(node.next, value)
|
67
|
+
|
68
|
+
def search_loop(node, value):
|
69
|
+
while node:
|
70
|
+
if node.data == value:
|
71
|
+
return node
|
72
|
+
node = node.next
|
73
|
+
|
74
|
+
if __name__ == '__main__':
|
75
|
+
top = Node(1, Node(2, Node(3, None)))
|
76
|
+
print(search(top, 2))
|
77
|
+
print(search_loop(top, 2))
|
78
|
+
```
|
2
微修正
answer
CHANGED
@@ -8,8 +8,7 @@
|
|
8
8
|
|
9
9
|
- 前提: データ構造としてのスタック
|
10
10
|
FILO (first-in-last-out) の PUSH と POP が list の append, pop
|
11
|
-
- 「関数」呼び出し時のコールスタック
|
11
|
+
- 「関数」呼び出し時のコールスタック, スタックフレーム
|
12
|
-
Python では Frame オブジェクト
|
13
12
|
- 「再帰」呼び出し時のスタック操作を、リストとループ処理で模倣する。
|
14
13
|
|
15
14
|
|
1
微修正
answer
CHANGED
@@ -22,7 +22,7 @@
|
|
22
22
|
Python では、これを Frame オブジェクトに纏めて、
|
23
23
|
- stack (積み上げる) の用語通り、関数呼び出し時に
|
24
24
|
関数の戻り先の情報を積み上げていきます。(append)
|
25
|
-
- 関数が終わった時(return もしくは終端に到達)に
|
25
|
+
- 関数の実行が終わった時(return/raise もしくは終端に到達)に
|
26
26
|
スタックの一番上を取り除きます (pop)
|
27
27
|
|
28
28
|
質問のコードでは、スタックに入れる内容は、独自実装なので異なりますが、
|