【发布时间】:2011-08-23 09:28:00
【问题描述】:
我意识到这个问题的答案可能因不同的语言而异,而我最感兴趣的语言是 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 并失去如果函数是尾递归的所有效率?
【问题讨论】:
标签: optimization language-agnostic partial tail-recursion