我意识到这个问题的答案可能会因不同的语言而异,而我最感兴趣的语言是C++。如果标签需要更改,因为这不能用与语言无关的方式回答,请随时取消。 部分尾递归函数是否仍然可以获得完全尾递归函数的优化优势?
是否有可能有一个函数是部分尾递归,并仍然有任何优势,尾递归会得到你?
据我所知,尾递归不是完成一个完整的函数调用,编译器会优化函数,只是将参数更改为新参数并跳转到函数的开头。
如果你有这样的功能:
def example(arg):
if arg == 0:
return 0 # base case
if arg % 2 == 0:
return example(arg - 1) # should be tail recursive
return 3 + example(arg - 1) # isn't tail recursive because 3 is added to the result
当优化器遇到类似的东西(其中函数是尾递归在某些情况下,而不是在其他人)将它打开一进一出jump
而另一个变成call
,或者将一些优化现实的事实(如果我知道它我不会问),它必须把所有变成call
,并且失去了如果函数是尾随函数时会产生的所有效率,递归?
是的,我知道我可以改变它在无条件尾部递归的地方,但我想举一个我正在谈论的例子。是的,我很确定C++(至少MSVC++)可以将相互递归函数转换为尾调用。 –
CPython实现*从不*优化尾部呼叫,而且Guido已将他的观点放在了主题上,称它为“unpythonic”。见http://neopythonic.blogspot.com/2009/04/tail-recursion-elimination.html –
@Dietrich是啊,我注意到这一点,当我试着本应该是一个尾递归析因函数:)太糟糕了guido是如此目光短浅。 –