2017-03-24 140 views
-4

如何在非尾遞歸中轉換此函數? 在此先感謝。如何在非尾遞歸中轉換尾遞歸

def recursive(values,names, aux, maxim, index_of_max, i, j): 

    if j == len(values) and i == len(values)-1: 

     return order(values, names, aux, maxim, index_of_max) 
    elif j == len(values): 

     i+=1 
     return recursive(values,names, aux, maxim, index_of_max, i, i+1) 
    elif values[i] >= values[j]: 

     return recursive(values,names, aux, maxim, index_of_max, i, j+1) 
    else: 
     aux[j] = max(aux[i]+1, aux[j]) 
     if aux[j] > maxim: 

      return recursive(values,names, aux, aux[j], j, i, j+1) 
     else: 

      return recursive(values,names, aux, maxim, index_of_max, i, j+1) 

我不知道如何傳遞的參數在我的功能在非尾遞歸

+2

你知道Python不會優化尾部調用嗎? –

+0

該函數已經是尾遞歸的了,因爲Python中的任何函數都可以是尾遞歸的,因爲cpython不能有效地支持尾遞歸。 –

+0

無論語言是否支持TCO,該函數仍然是尾遞歸。 –

回答

1

一個微不足道的答案轉換:使用return 0 + recursive(...)或類似的東西。這會在遞歸調用之後強制對添加進行評估,使其成爲非尾部。

+0

解決方案是正確的,但我需要更多aproximated謝謝! – Drewico

0

如果您擔心堆棧溢出並希望對函數進行更正式的轉換,那麼您可以構建一個蹦牀,如同這個article一樣。每個遞歸函數都可以轉化爲迭代,反之亦然。但是,性能影響與編碼表面上的語言相關。

+0

上一篇關於將函數轉換爲迭代函數的文章(http://blog.moertel.com/posts/2013-05-11-recursive-to-iterative.html)可能是更好的答案。當然,我在兩條線之間閱讀,因爲它不完全清楚OP的意圖。 – SpoonMeiser

+0

我同意你的看法,OP應該澄清原因並弄清楚他是否在方法之前對功能有了解。 – hurturk