程式的輸出
m = [1, 2, 3, 4, 5]
d = lambda y: (d(y[1:]) y[:1] if y else [])
print(d(m))
是 [5, 4, 3, 2, 1]。
我可以理解print(d(m))是將串列m作為引數并在 lambda 函式y = m中。然后,y[1:] = [2, 3, 4, 5]和y[:1] = [1]。但在那之后會發生什么?誰能解釋一下這個輸出是怎么來的?
uj5u.com熱心網友回復:
Lambdad是一個純函式,因此我們可以使用替換來評估運算式。為了評估d(m),我們首先用d和替換m它們的值 -
d(m)
# d := lambda y: d(y[1:]) y[:1] if y else []
(lambda y: d(y[1:]) y[:1] if y else [])(m)
# m := [1,2,3,4,5]
然后我們將 lambda 應用于它的引數 -
(lambda y: d(y[1:]) y[:1] if y else [])([1,2,3,4,5])
# y := [1,2,3,4,5]
d([1,2,3,4,5][1:]) [1,2,3,4,5][:1] if [1,2,3,4,5] else []
d([1,2,3,4,5][1:]) [1,2,3,4,5][:1]
d([2,3,4,5]) [1]
# d := lambda y: d(y[1:]) y[:1] if y else []
使用 Python 的熱切評估策略,我們在應用函式之前評估所有引數。繼續這個策略,直到得到答案——
(lambda y: d(y[1:]) y[:1] if y else [])([2,3,4,5]) [1]
# y := [2,3,4,5]
(d([2,3,4,5][1:]) [2,3,4,5][:1] if [2,3,4,5] else []) [1]
(d([2,3,4,5][1:]) [2,3,4,5][:1]) [1]
(d([3,4,5]) [2]) [1]
d([3,4,5]) [2] [1]
# d := lambda y: d(y[1:]) y[:1] if y else []
(lambda y: d(y[1:]) y[:1] if y else [])([3,4,5]) [2] [1]
# y := [3,4,5]
(d([3,4,5][1:]) [3,4,5][:1] if [3,4,5] else []) [2] [1]
(d([3,4,5][1:]) [3,4,5][:1]) [2] [1]
(d([4,5]) [3]) [2] [1]
d([4,5]) [3] [2] [1]
# d := lambda y: d(y[1:]) y[:1] if y else []
(lambda y: d(y[1:]) y[:1] if y else [])([4,5]) [3] [2] [1]
# y := [4,5]
(d([4,5][1:]) [4,5][:1] if [4,5] else []) [3] [2] [1]
(d([4,5][1:]) [4,5][:1]) [3] [2] [1]
(d([5]) [4]) [3] [2] [1]
d([5]) [4] [3] [2] [1]
# d := lambda y: d(y[1:]) y[:1] if y else []
(lambda y: d(y[1:]) y[:1] if y else [])([5]) [4] [3] [2] [1]
# y := [5]
(d([5][1:]) [5][:1] if [5] else []) [4] [3] [2] [1]
(d([5][1:]) [5][:1]) [4] [3] [2] [1]
(d([]) [5]) [4] [3] [2] [1]
d([]) [5] [4] [3] [2] [1]
# d := lambda y: d(y[1:]) y[:1] if y else []
(lambda y: d(y[1:]) y[:1] if y else [])([]) [5] [4] [3] [2] [1]
# y := []
(d([][1:]) [][:1] if [] else []) [5] [4] [3] [2] [1]
([]) [5] [4] [3] [2] [1]
在這一點上,基本情況已達到,d不再擴展為帶有 another 的運算式d。我們可以開始折疊堆疊以獲得最終輸出 -
[] [5] [4] [3] [2] [1]
[5] [4] [3] [2] [1]
[5,4] [3] [2] [1]
[5,4,3] [2] [1]
[5,4,3,2] [1]
[5,4,3,2,1]
uj5u.com熱心網友回復:
該函式正在使用遞回反轉作為輸入的串列。
該演算法的作業原理如下:
它采用串列的第一項并將其帶到最后。然后,剩下的部分將一遍又一遍地做同樣的事情,直到它得到一個空串列。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/496380.html
上一篇:需要幫助在React中使用給定的json結構創建檔案夾樹組件
下一篇:為什么此合并排序中存在分段錯誤?
