【问题标题】:Can someone help me understanding this recursion code有人可以帮我理解这个递归代码吗
【发布时间】:2021-12-24 21:57:31
【问题描述】:

我目前很难理解这段代码,因为我不是递归专家。所以,我想请人解释一下这背后的逻辑。

#include <iostream>

using namespace std;

void fun(int n){
    if(n==0){
        return;
    }
    for (int i = 0; i < 5; i++) {
        cout<<n<<" ";
        fun(n-1);
    }
}
int main()
{
    fun(5);
    return 0;
}

输出- https://ideone.com/ZvLGih

我理解输出到 5 4 3 2 1 然后当基本条件达到时,然后在我无法理解逻辑之后。

【问题讨论】:

  • 令人困惑的部分是递归和迭代同时结合。
  • 您尚未包含 fun(5) 的完整输出。完整的输出不适合评论
  • This 产生您声明的输出。您的代码产生不同的输出
  • 您引用的输出不是由显示的代码产生的。 fun(2) 调用应该连续产生五个1s,而不是两个。
  • @Caleth 您的代码不同。您的循环运行n 次,OP 的循环正好运行 5 次。

标签: c++ recursion


【解决方案1】:

假设i &lt; 5 是一个错字并且应该是i &lt; n,它的工作原理与这个完全非递归的程序完全一样:

void fun0()
{
    return;
}

void fun1()
{
    for (int i = 0; i < 1; i++) {
        cout << 1 << " ";
        fun0();
    }    
}

void fun2()
{
    for (int i = 0; i < 2; i++) {
        cout << 2 << " ";
        fun1();
    }    
}

void fun3()
{
    for (int i = 0; i < 3; i++) {
        cout << 3 << " ";
        fun2();
    }    
}

void fun4()
{
    for (int i = 0; i < 4; i++) {
        cout << 4 << " ";
        fun3();
    }
}

void fun5()
{
    for (int i = 0; i < 5; i++) {
        cout << 5 << " ";
        fun4();
    }    
}

int main()
{
    fun5();
}

或者这个只有main的程序:

int main()
{
    for (int i = 0; i < 5; i++) {
        cout << 5 << " ";
        for (int i = 0; i < 4; i++) {
            cout << 4 << " ";
            for (int i = 0; i < 3; i++) {
                cout << 3 << " ";
                for (int i = 0; i < 2; i++) {
                    cout << 2 << " ";
                    for (int i = 0; i < 1; i++) {
                        cout << 1 << " ";
                    }    
                }    
            }    
        }
    }    
}

【讨论】:

  • 我无法理解其中的逻辑,但你做了真正的手工让我理解 :) 谢谢你所以 mch
【解决方案2】:

当您达到两个以上的递归级别时,很难理解递归。一次记住所有递归调用是不可能的,因此理解它的最佳方法是研究基本案例。寻找调用 fun(1)、fun(2) 和 fun(3) 之间的模式。

乐趣(1): 1 1 1 1 1

乐趣(2): 2 1 1 1 1 1 2 1 1 1 1 1 2 1 1 1 1 1 2 1 1 1 1 1 2 1 1 1 1 1

乐趣(3): 可以在编译器中查看的一长串数字

看起来它只是打印一个数字 n,然后是数字 n-1 的 5 次迭代,以及从 n-k 到 k=n 的所有迭代。所以为了乐趣(3)它会开始: 3 2 1 1 1 1 1 2 1 1 1 1 1 2 1 1 1 1 1 2 1 1 1 1 1 2 1 1 1 1 1 3

【讨论】:

    猜你喜欢
    • 2018-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多