Я получаю неожиданный вывод - PullRequest
1 голос
/ 06 мая 2019

Я предположил, что для следующего кода вывод равен «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 ]

2 голосов
/ 06 мая 2019

Это базовая рекурсия.Просто попытайтесь создать дерево рекурсии для программы, которую вы написали, и вы сможете понять, почему вывод, который вы видите, имеет значение 3.

Вы ожидаете 0 в качестве ответа, только на основепоследний рекурсивный вызов (условие завершения), но когда происходит рекурсивный вызов, существует концепция записей активации, которые поддерживаются в форме структуры данных стека.

Дерево рекурсии будет выглядеть примерно так, как показано в Дерево рекурсии для общего кода

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 голосов
/ 06 мая 2019

Следующая ссылка является отличным источником для изучения C Recursion, и, как указал @MFisherKDX, поможет устранить мою путаницу.

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

После каждой рекурсии возвращается значение. складывая все значения:

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

дает ответ как 3.

1 голос
/ 06 мая 2019

Рекурсионный стек для вашего кода выглядит следующим образом:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...