C 我得到了意想不到的结果

C 我得到了意想不到的结果,c,recursion,C,Recursion,我假设以下代码的输出为“0”,但我得到的输出为“3” #include<stdio.h> int num_digit(int n); int num_digit(int n) { if (n == 0) return 0; else return 1 + num_digit(n/10); } int main() { int k = num_digit(123); printf("%d\n",k); ret

我假设以下代码的输出为“0”,但我得到的输出为“3”

#include<stdio.h>
int num_digit(int n);

int num_digit(int n)
{
    if (n == 0)
        return 0;
    else
        return 1 + num_digit(n/10);
}

int main() {
    int k  = num_digit(123);
    printf("%d\n",k);
    return 0;
}

下面的链接为学习C递归提供了一个很好的来源,@MFisherKDX指出,这有助于解决我的困惑

每次递归发生后,它都返回一个值。 将所有值相加:

0+1 = 1
1+1 = 2
2+1 = 3

答案为3。

下面的链接为学习C递归提供了一个很好的来源,@MFisherKDX指出,这有助于解决我的困惑

每次递归发生后,它都返回一个值。 将所有值相加:

0+1 = 1
1+1 = 2
2+1 = 3

答案为3。

这是基本的递归。只要试着为您编写的程序创建一个递归树,您就应该能够弄清楚为什么您看到的输出是3

您期望0作为答案,仅基于最后一个递归调用终止条件,但当发生递归调用时,存在以堆栈数据结构形式维护的激活记录的概念

递归树将类似于中所示

使用替换:

num_digits(123) = 1 + (1 + (1 + (0)))

请清楚地跟随上面的括号,您应该能够完全理解从您编写的代码中得到的输出。

这是基本的递归。只要试着为您编写的程序创建一个递归树,您就应该能够弄清楚为什么您看到的输出是3

您期望0作为答案,仅基于最后一个递归调用终止条件,但当发生递归调用时,存在以堆栈数据结构形式维护的激活记录的概念

递归树将类似于中所示

使用替换:

num_digits(123) = 1 + (1 + (1 + (0)))

请清楚地跟随上面的括号,您应该能够完全理解从您编写的代码中得到的输出。

代码的递归堆栈如下所示

1 + num_digit(123/10);
1 + num_digit(12/10);
1 + num_digit(1/10); //at this point your code will return 0 for num_digit(1/10)
1+0=1
1+1=2
1+2=3
回溯如下所示

1 + num_digit(123/10);
1 + num_digit(12/10);
1 + num_digit(1/10); //at this point your code will return 0 for num_digit(1/10)
1+0=1
1+1=2
1+2=3

因此,最终的答案是3

递归堆栈,代码如下所示

1 + num_digit(123/10);
1 + num_digit(12/10);
1 + num_digit(1/10); //at this point your code will return 0 for num_digit(1/10)
1+0=1
1+1=2
1+2=3
回溯如下所示

1 + num_digit(123/10);
1 + num_digit(12/10);
1 + num_digit(1/10); //at this point your code will return 0 for num_digit(1/10)
1+0=1
1+1=2
1+2=3

因此,最终答案是3

请解释为什么您期望输出为0。也许可以先告诉我们foo应该做什么。这个程序的正确输出是3。为什么你期望它会有所不同呢?抓起一个调试器,逐行运行代码。这将告诉你发生了什么,为什么结果是什么is@AnoCorff:熟悉递归。它的基本情况和非基本情况方面。请解释为什么您希望输出为0。也许可以先告诉我们foo应该做什么。这个程序的正确输出是3。为什么你期望它会有所不同呢?抓起一个调试器,逐行运行代码。这将告诉你发生了什么,为什么结果是什么is@AnoCorff:熟悉递归。它的基本情况和非基本情况方面。