对于以下代码,我假定输出为“ 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;
}
答案 0 :(得分:2)
以下链接为学习C递归提供了绝佳的资源,正如@MFisherKDX指出的那样,可以帮助解决我的困惑。
每次递归发生后,它都会返回一个值。 将所有值加起来:
0+1 = 1
1+1 = 2
2+1 = 3
给出答案为3。
答案 1 :(得分:2)
这是基本的递归。只需尝试为您编写的程序创建一个递归树,您就应该能够弄清楚为什么看到的输出是3。
您期望仅基于最后一次递归调用(终止条件)来回答0,但是当发生递归调用时,存在一个激活记录的概念,该记录以堆栈数据结构的形式维护。
递归树的外观类似于Recursion Tree for shared code
num_digits(123) = 1 + num_digits(12)
num_digits(12) = 1 + num_digits(1)
num_digits(1) = 1 + num_digits(0)
num_digits(0) = 0
使用替换:
num_digits(123) = 1 + (1 + (1 + (0)))
请清楚地遵循上面的括号,您应该能够完全理解从编写的代码中得到的输出。
答案 2 :(得分:1)
代码的递归堆栈如下所示
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