2017-03-24 142 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