递归函数问题,重复返回

时间:2015-07-29 01:05:35

标签: c++ recursion

我在使用递归函数时遇到问题。 我现在曾经发生过几次这样的事情,但我只是做了尴尬的解决方法。

#include <iostream>
using namespace std;

int fib(int n);

int main() {
    int i = 5;
    i = fib(i);
    cout << i << endl;
    system("pause");
}

int fib(int n) {
    cout << n << endl;
    if (n <= 0)
        return 0;
    else if (n == 1)
        return 1;
    else
        return fib(n - 1) + fib(n - 2);
}

我遇到的问题是输出远远不是它应该是的,通过遵循我可以看到的断点,一旦函数完成它应该,else语句下的最后一行仍然是调用。 我确定这是一件很简单的事我做错了但如果有人能够对此有所了解,我将感激不尽!

4 个答案:

答案 0 :(得分:1)

该函数是正确的,即使您应该F(1) fib(0)fib(1),因为在您的实现fib(0) == 0中,但该系列的第一个元素是1 ,而不是0。

除此之外,我没有看到任何问题,您遇到的问题存在,例如,在LLDB中,放置在函数中间的return语句使调试器“通过”函数的最后一条指令(但这只是由代码和底层二进制文件之间的映射引起的),它并没有真正执行该语句。

答案 1 :(得分:0)

关于你对这种痕迹的困惑,我想我可以解释一下。

fib(5)中,您以递归方式调用fib(4)。完成所有递归后,解决了,你回到了fib(5) ...然后递归调用fib(3),这样你就可以做更多的计算......然后一旦完成,你回到了fib(5),在完成之前还有其他的事要做,可以回来。

(免责声明:上述订单无法保证;例如,编译器可能会先决定让您的程序先计算fib(3)然后再计算fib(4)

fib(5)的计算中,最终返回行在不同的调用中执行次。对于大型n,您需要进行大量的递归调用;这个例子是动态编程和/或记忆化的好处的常见示例之一。 (或者甚至只是仔细地重构递归,这样你就没有递归调用树;例如,有一个递归实现的函数返回一对由n - th 组成的对{ {1}} - 斐波那契数字)

答案 2 :(得分:0)

希望这会有所帮助..

#include <iostream>
using namespace std;

int Fibo(int);

int main(void) {
int number;

cout << "Please enter a positive integer: ";
cin >> number;
if (number < 0)
    cout << "That is not a positive integer.\n";
else
    cout << " Fibonacci is: " << Fibo(number) << endl;
}

int Fibo(int x) 
{
    if (x < 2){
     return x;
    }     
    return (Fibo (x - 1) + Fibo (x - 2));
}

答案 3 :(得分:-1)

我没有测试过它,但它可能是一个“悬而未决的问题”。对条件块不使用花括号是一种糟糕的编码风格。帮自己一个忙,写一下吧。像

if( n <= 0 )
{
    return( 0 );
}
else if( n == 1 )
{
    return( 1 );
}
else
{
    return( fib( n - 1 ) + fib( n - 2 ) );
}

我怀疑你的代码被解释为

if( n <= 0 )
{
    return( 0 );
}
else
{
    if( n == 1 )
    {
        return( 1 );
    }
    else
    {
        return( fib( n - 1 ) + fib( n - 2 ) );
    }
}

没有花括号,你的代码是暧昧的。我不知道编译器对您的代码片段的哪种解释是有利的。您可以通过引入大括号轻松检查这是否是问题。