同じ関数を再帰的に同時に二回呼び出した場合の実行順番があっているのかどうかが不安になります。
下記アウトプットに記載していますが、どういう順番で呼び出されていますでしょうか?
また、片方がbase caseでたどりついた場合、未実行の片方の関数の実行結果はどこにいってしまうのでしょうか?
下記、詳細な質問の説明と背景になります。
ーーー
例えば、下記コードでは、はじめに左側にある関数が再帰的にbase caseまで呼び出され、base caseまでたどり着いたあとは、右側の関数実行にいくのではなく、一回base caseで返したreturnの値を右側関数を無視してresに入力するって言う理解であっていますでしょうか?
res = recur_array_index(num, i-1) + recur_array_index(nums[1:], i)
私の最初の理解では、左側の関数呼び出しがbase caseまでたどり着いたら、下記のような形になり左側関数がbase caseにたどり着いたときの引数で右側の関数を実行すると思っていました。
res = [[]] + recur_array_index(nums[1:], i)
つまり、右側関数が同じくbase caseまで呼び出され、下記のような形でresが返ると思っていました。
res = [[]] + []
しかし、print文
をつかって出力したところ、そういう順番でresが出力されていないことがわかり、どういう順番で実行されるのかなと思いました。
ーーー
python
1def recur_array(nums): 2 i = len(nums) 3 4 def recur_array_index(nums, i): 5 if i == 0: 6 return [[]] 7 elif not nums: 8 return [] 9 num = nums[1:] 10 print(f"nums: {nums}, num: {num}, i: {i}") 11 res = recur_array_index(num, i-1) + recur_array_index(nums[1:], i) 12 print(f"res: {res}") 13 return res 14 return recur_array_index(nums, i) 15 16if __name__ == "__main__": 17 nums = [1,2,3,4] 18 print(recur_array(nums))
アウトプット
shell
1$ python recursion.py 2nums: [1, 2, 3, 4], num: [2, 3, 4], i: 4 3nums: [2, 3, 4], num: [3, 4], i: 3 4nums: [3, 4], num: [4], i: 2 5nums: [4], num: [], i: 1 6res: [[]] ------------------> 左側の関数の返り値がresにはいって出力されている。 7nums: [4], num: [], i: 2 -----> 右側の関数が再帰的に呼び出されている??? 8res: [] --------------------> 右側の関数の返り値がresにはいって出力されている。 9res: [[]] ------------------> 左側の関数の返り値がresにはいって出力されている。なぜ、左側の関数を呼び出しはじめた??? 10nums: [3, 4], num: [4], i: 3 -----> 左側の関数が再帰的に呼び出されている??? 11nums: [4], num: [], i: 2 12res: [] --------------------> 右側の関数の返り値がresにはいって出力されている。 13nums: [4], num: [], i: 3 14res: [] 15res: [] 16res: [[]] 17nums: [2, 3, 4], num: [3, 4], i: 4 18nums: [3, 4], num: [4], i: 3 19nums: [4], num: [], i: 2 20res: [] 21nums: [4], num: [], i: 3 22res: [] 23res: [] 24nums: [3, 4], num: [4], i: 4 25nums: [4], num: [], i: 3 26res: [] 27nums: [4], num: [], i: 4 28res: [] 29res: [] 30res: [] 31res: [[]] 32[[]]
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。