任何人都可以解释这个递归代码是如何工作的,以及程序堆栈或内存中逐步发生的事情?

时间:2016-02-11 15:35:13

标签: c recursion

这是我的代码:

#include <stdio.h>

void fun(int n)
{
    if(n > 0)
    {
        fun(n-1);
        printf("%d ", n);
        fun(n-1);
    }
}

int main()
{
    fun(4);
    return 0;
}

,此代码的输出为1 2 1 3 1 2 1 4 1 2 1 3 1 2 1。 但我无法理解递归调用之间究竟发生了什么,何时执行print语句以及每次调用时n的值是多少。 我是编码的初学者,请逐步解释。

1 个答案:

答案 0 :(得分:2)

如果从接近递归的基本情况开始的事情开始,将更容易理解发生了什么。假设您fun(0)中有main。在fun体内发生这种情况:

void fun(int n)
{
    if(n > 0) //this is false, so function does nothing
    {
        fun(n-1);
        printf("%d ", n);
        fun(n-1);
    }
}

现在如果foo(1)中有main怎么办?

void fun(int n)
{
    if(n > 0) //this is true, lets execute the block
    {
        fun(n-1); //call fun(0), this does nothing
        printf("%d ", n); //print value 1
        fun(n-1);//call fun(0) again, does nothing
    }
}

因此您可以看到fun(1)将打印值1,fun(2)怎么样?

void fun(int n)
{
    if(n > 0) 
    {
        fun(n-1);        //call fun(1), prints 1
        printf("%d ", n);//print value 2
        fun(n-1);        //call fun(1), prints 1
    }
}

因此,您可以看到foo(2)将打印“1 2 1”,同样foo(3)将打印1 2 1 3 1 2 1

堆栈如何建立和展开是非常有趣的,你应该坐下来用笔和纸来解决这个问题。

这称为纯结构递归,在递归的每一步都接近基本情况。