Recursion 重载和递归

Recursion 重载和递归,recursion,overloading,Recursion,Overloading,在我的数据结构和算法类中,我一直在做递归方面的问题,对于一些尾部递归函数,除了让主函数调用一个helper函数,而helper函数是尾部递归部分之外,我想不出做什么,因为我必须传递与原始函数不同的参数 虽然这在技术上是尾部递归的,但原始函数最终处理基本情况,并且在主要情况下将附加参数传递给实际的尾部递归函数 显然,这种方法有点违背了递归的思想,尤其是在家庭作业、考试之类的课堂环境中 这就是为什么今天我想,我不能创建一个重载版本的函数来接受这些附加参数并继续工作,而不是创建一个helper函数吗?

在我的数据结构和算法类中,我一直在做递归方面的问题,对于一些尾部递归函数,除了让主函数调用一个helper函数,而helper函数是尾部递归部分之外,我想不出做什么,因为我必须传递与原始函数不同的参数

虽然这在技术上是尾部递归的,但原始函数最终处理基本情况,并且在主要情况下将附加参数传递给实际的尾部递归函数

显然,这种方法有点违背了递归的思想,尤其是在家庭作业、考试之类的课堂环境中

这就是为什么今天我想,我不能创建一个重载版本的函数来接受这些附加参数并继续工作,而不是创建一个helper函数吗?它在技术上是递归的,因为函数中的所有调用都是对自身的,尽管参数比初始调用多

下面是一个粗略的例子:

int fibonacci(int n) {
    if (n == 1)
        return 1;
    else
        return fibonacci(n, 2, 1, 2);
}

int fibonacci(int n, int f1, int f2, int c) {
    if (c == n)
        return f1;
    else
        return fibonacci(n, f1 + f2, f1, c + 1);
}
它仍然是定义意义上的递归吗?这样行吗?做递归优化的编译器(不知道它到底是如何工作的,但知道它的存在)会将此应用于此吗


我假设它仍然是递归的,因为它在技术上仍然调用自己,我认为它会优化,只是忽略了最初的调用。但这就是为什么我要问,看看我是否正确。

是的,我仍然会称之为“递归”。fibonacci的单参数重载不是递归的,但4参数重载无疑是递归的


也就是说:不要自欺欺人地认为,
fibonacci
函数总体上是递归的。单参数重载从不调用自身。在类似Java的语言中,函数/方法是由其签名唯一定义的,您仍然有两个不同的函数。

我知道,我总是觉得编写多参数函数和编写“假设这些变量是this,this&that,n是请求的斐波那契数。”@Portaljacker不要忘记默认参数(如果你使用C++),等等,什么?不知道这是什么语法?我假设你可以在连续的递归调用中替换那些值?其他语言支持什么?我的大部分类工作是在java中,但是有些是C++的,所以知道这样的东西是很好的!@ PaltJAKER你的函数签名看起来像“代码>斐波那契”(int n,int f1=2,int f2=1,int c=2)。这样,您可以使用一个或多个(但少于4个)调用它参数和其他参数将有它们的默认值,或者你可以用它们全部调用,它们将有这些值。非常感谢!我觉得我在某个地方看到了,但我从来都不确定我是否在编。有没有关于其他语言的想法?顺便说一句,你犯了一个错误,这对于编写递归f的人来说是很常见的函数:您忘记了
返回函数调用的值(例如
返回fibonacci(…)
)。只是修复了这个问题,这很奇怪,因为程序仍然运行并在我执行时输出答案是的,这可能是因为上次函数调用从
fibonacci(int,int,int,int)返回
f1
哪一个是所需的斐波那契数(因此,如果您在x86上,它将存储在eax寄存器中)但是,由于没有“代码”>返回< /C> > s,最后一个函数调用的值没有被覆盖,所以它恰好工作。但是它不会总是在所有体系结构上工作,并且在技术上是无效的C++,因为“不是所有的路径返回值”。这是编译器应该提醒您的。这是递归处理斐波那契的“标准”方法。重载是不相关的,因为名称可能是完全随机的,并且仍然具有所需的语义(即使它被认为是“坏代码”)——在具有重载的静态类型语言中,类型签名是“名称”的一部分。虽然“prep”函数本身不是递归函数,但第二个函数显然是——并且该函数是实际完成工作的地方。另一句话:main/original/prep函数不处理基本情况。基本情况是递归结束的地方(在您的示例中
(c==n)
)并由helper函数处理。您可以从主函数中删除
n==1的测试,只需
返回fibonacci(n,1,1)