定制map函数中的递归——不明白程序流程

问题描述 投票:0回答:1

我正在学习尾递归,不明白这个例子的流程。 我正在使用 VSCode 调试器,不明白为什么当程序到达

return[f(arg), *result]
时,它会转到
result = my_map(f, rest)
行,并且
arg
变成
2

(附图VSCode Debugger - step I don't understand)。

def my_map(f, iterable):
    try:
        arg, *rest = iterable
    except ValueError:
        return []
    result = my_map(f, rest)
    return[f(arg), *result]

print(my_map(lambda x: x+10, [1,2,3]))

我不习惯解包运算符(*),所以也许我在那里遗漏了一些东西。

由于

arg
3
并且
result
[]
,我只是期待
return
返回像
[3,[]]
这样的列表。

标题已编辑:它不是尾递归,因为递归不是函数所做的最后一件事。-谢谢 > https://stackoverflow.com/users/1491895/barmar

编辑:关于我不明白的内容的更多解释: 首先,我得到所有内容,直到结果变成空列表。 looping through try-except block 然后,我们进入 return [f(arg),*result] 我不明白为什么执行(从调试器中看到)返回到上一行(结果)。因此,如果有人可以向我解释从那时起发生了什么......

python tail-recursion iterable-unpacking
1个回答
0
投票

为了理解流程,我首先观看这个关于递归的理想视频https://www.youtube.com/watch?v=AfBqVVKg4GE 然后我就明白了,这根本不是一个理解递归的好例子……

因此,基于此,我以与视频中相同的方式绘制了调用堆栈状态图。 希望有帮助

Call stack status

© www.soinside.com 2019 - 2024. All rights reserved.