C 递归函数的意外输出

C 递归函数的意外输出,c,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 &g

我是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);
    }
}
#包括
虚无乐趣(int);
typedef int(*pf)(int,int);
int proc(pf,int,int);
int main()
{
INTA=3;
乐趣(a);
返回0;
}
虚无乐趣(int n)
{
如果(n>0)
{
乐趣(--n);
printf(“%d”,n);
乐趣(--n);
}
}

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


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

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

要浏览注释中提到的代码,可以将函数作为“块”编写,如下面的伪代码中所示,约定在被调用的函数中改变更新后的值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。

如果它打印出
0,1,2,3
递归将永远不会结束!请你解释一下。。。。。。谢谢你能自己理解它,只需调用函数并在一张纸上写下
n
的当前值。查看代码:void-fun(int-n){if(n>0){fun(--n);作为一个直到
n==0
才打印任何内容的循环。当
n
为0时,递归结束,首先到达
print
。@IharobAlAsimi我尝试了,但没有得到它。谢谢你的回答。但我对这个程序感到困惑,我在纸上尝试了它,但没有得到它。我没有得到它最后是如何打印0的。请原谅请解释。。。