无法输入函数的荒谬结果

问题描述 投票:0回答:1
int fun(int n)
{
    if (n > 0) 
    {
        fun(n-1);

        printf("%d ", n);

        fun(n-1);  
    }
    else
        return n; 
}

当我进入 (n=4) 我得到 ( 1 2 1 3 1 2 1 4 1 2 1 3 1 2 1 ).

所以我不明白 它是怎么做的?谁能给我解释一下这个步骤?

enter
1个回答
1
投票

首先请注意,只有当n为0或负值时,你才会返回一个值,所以如果你用一个大于0的参数调用fun,然后尝试使用返回值,你会调用未定义的行为。你应该在if的两个分支中都有一个返回语句,或者去掉返回语句,将函数的返回类型改为void。

至于为什么函数会打印出这样的结果,我们从基本情况出发,一步步往上走。

如果你以0为参数(或负数)调用fun会发生什么?if条件为false,它直接进入返回语句--什么也不打印。所以 fun(0);什么也不打印。好吧,那么现在fun(1)会发生什么呢?

现在fun(1)会发生什么?这次if条件为真,所以执行body。由于n是1(因此n-1是0),我们得到:fun(0);, printf("%d", 1); 和再次fun(0);。正如我们在上一段中所确定的那样,fun(0);没有打印任何内容,所以所有发生的事情都是打印了 "1"。

现在fun(2)会发生什么?同样,if条件为真,所以正文被执行。由于n是2(因此n-1是1),我们得到:fun(1);, printf("%d", 2);和再次fun(1);。正如我们在上一段中建立的那样,fun(1);打印的是 "1",所以这将打印 "1",接着是 "2",再接着是 "1",使得f(2)的最终输出是 "1 2 1"。

现在如果你继续用这种方法来处理fun(3)和fun(4),你会得到和你发布的fun(4)一样的输出。

© www.soinside.com 2019 - 2024. All rights reserved.