我得到了意外的输出

时间:2019-05-06 04:08:17

标签: 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);
    return 0;
}

3 个答案:

答案 0 :(得分:2)

以下链接为学习C递归提供了绝佳的资源,正如@MFisherKDX指出的那样,可以帮助解决我的困惑。

  

https://www.programiz.com/c-programming/c-recursion

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

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