def singlesR(xs):
if xs != [] :
return [[xs[0]]] singlesR(xs[1:])
else :
return []
<遞回函式>
如何更改為尾遞回函式?
#result value
singlesR([1,2,3,4]) == [[1], [2], [3], [4]]
uj5u.com熱心網友回復:
如評論中所述并在此答案中進一步討論, python沒有尾遞回優化。
Haskell 等其他語言確實支持尾遞回。這個函式可以在 Haskell 中重寫為尾遞回函式,如下所示:
singlesR = singlesR' []
where singlesR' acc [] = acc
singlesR' acc (x:xs) = singlesR' ([x]:acc) xs
這里的主要觀察是,在尾遞回版本中,所有作業都是在遞回呼叫內部完成的。
uj5u.com熱心網友回復:
如果你想要這個帶有尾呼叫,你需要添加一個累加器:
def singlesR(xs, accumulator=[]):
if not xs:
return accumulator
accumulator = accumulator [xs[0]]
return singlesR(xs[1:], accumulator)
請注意,現在returning 之前的最后一次呼叫確實是對singlesR.
但正如評論中所述:由于python中沒有尾呼叫優化,因此不會有性能提升。
請注意,在您的版本中
return [[xs[0]]] singlesR(xs[1:])
對的呼叫singlesR不在尾部位置-在呼叫之后有對 的呼叫list.__add__。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/448936.html
