嵌套递归调用-这是尾递归吗?

问题描述 投票:0回答:1

[我认为我理解了尾递归函数的教科书定义:该函数在函数调用后不执行任何计算。我还得到的结果是,尾部递归函数将提高内存效率,因为它每次调用仅需要一条记录,而不是像常规递归那样保留每个记录。

我不太清楚的是该定义如何应用于嵌套调用。我将提供一个示例:

func foo91(x int)
    if(x > 100):
        return x - 10
    else:
        return foo91(foo91(x+11))

我最初想出的答案是它不是尾递归按定义(因为外部调用是在之后评估内部调用,所以其他计算在第一次调用之后进行),因此,带有嵌套递归调用的函数通常不是尾递归;另一方面,它在实践中是相同的,因为它具有尾递归功能的副作用:在我看来,整个功能只需要一个激活记录。是真的吗?

嵌套的递归函数调用通常会产生大量的尾递归吗?

algorithm recursion tail-recursion
1个回答
0
投票

您的理解仅部分正确。

您正确定义了尾递归。但是它是否真正有效取决于实现。在某些语言(例如Scheme)中。但是大多数语言都像JavaScript,但事实并非如此。特别地,关键的权衡之一是使尾递归有效,这意味着您将失去堆栈回溯。

由于您的实际问题,内部调用不是尾部递归的,因为它必须返回到您的调用并执行有效的操作。但是外部调用是尾递归的。

© www.soinside.com 2019 - 2024. All rights reserved.