递归函数的意外输出

时间:2017-03-20 15:41:40

标签: c

我是c编程的新手。我编写了这个程序并希望打印0, 1, 2, 3,但它正在打印0,1,2,0。我正在学习递归。为什么打印0,1,2,0请逐步解释。

#include <stdio.h>
void fun(int);
typedef int (*pf) (int, int);
int proc(pf, int, int);

int main()
{
    int a = 3;
    fun(a);
    return 0;
}

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

2 个答案:

答案 0 :(得分:2)

查看程序无法打印3的最简单方法是,在调用任何fprintf之前,代码必须始终运行 - 至少一次,因此无法打印起始值。

要完成注释中提到的代码,可以将函数写为“块”,如下面的伪代码中所述,约定n的更新值在被调用函数中被突变但是当然不是相反。然后流程看起来像:

{n:3--->2
    {n:2--->1
        {n:1--->0
            {n:0 ---> return}
            print(n=0)
            n:0--->-1
                {n:-1 ---> return}
        }
        print(n=1)
        n:1--->0
            {n:0 ---> return}
    }
    print(n=2)
    n:2--->1
    {n:1--->0
        {n:0 ---> return}
        print(n=0)
        n:0--->-1
        {n:-1 ---> return}
    }
}

打印确实是0,1,2,0。

答案 1 :(得分:0)

其中一个问题来自--n。实际上,这不是一条指令,而是两条指令--n等于n=n-1。因此,您永远不会打印从函数调用中获得的值,但值将减去一个值。这就是为什么你得到的最大值是2。

然后,我让你找到如何自己解决问题。正如@Iharob和@Zimano向你建议的那样,把它写在纸上会对你有帮助。