Неверный вывод из рекурсивной функции для вычисления суммы цифр числа - PullRequest
2 голосов
/ 12 августа 2011

Я пытался написать функцию, которая вычисляла бы сумму цифр числа, используя рекурсию, но вывод неправильный.Вот код:

/*Write a function to calculate sum of digits of a  number using recursion*/
/*Author:Udit Gupta     Date:10/08/2011*/

#include<stdio.h>

int sum (int);

int main () {
    int n,s;

    printf ("Enter the number:");
    scanf ("%d",&n);

    s = sum (n);
    printf ("The sum of the digits of the number is %d",s);
}


int sum (int a) {
    int f;

    if (a == 0) {
         return f;
    }
    f = (a% 10) + sum (a/10);
}

Вот некоторые из выходных значений:

 udit@udit-Dabba ~/Desktop/letusc/ch5/J $ ./a2.out
 Enter the number:123
 The sum of the digits of the number is 7

 udit@udit-Dabba ~/Desktop/letusc/ch5/J $ ./a2.out
 Enter the number:1234
 The sum of the digits of the number is 2919930

 udit@udit-Dabba ~/Desktop/letusc/ch5/J $ ./a2.out
 Enter the number:123456
 The sum of the digits of the number is 4620297

 udit@udit-Dabba ~/Desktop/letusc/ch5/J $ ./a2.out
 Enter the number:12345
 The sum of the digits of the number is 15  /*Only this one seems correct*/

Может кто-нибудь помочь мне понять, почему это не работает правильно?

Ответы [ 5 ]

5 голосов
/ 12 августа 2011

Давайте посмотрим на эту рекурсивную функцию более подробно:

int sum (int a) {
    int f;

    if (a == 0)
        return f;

    f = (a% 10) + sum (a/10);
}

Пока вы на правильном пути и у вас в целом правильная идея, ваша фактическая реализация немного ошибочна.Для начала давайте посмотрим на следующие строки:

if (a == 0)
    return f;

У вас есть правильная идея завершить рекурсию, когда a достигает нуля, но то, как вы это делаете, немного не так.В частности, вы возвращаете значение целого числа f, но вы никогда не инициализировали его.Это означает, что возвращаемое значение полностью произвольно.Вместо того, чтобы писать это, я думаю, что вы, вероятно, хотели написать что-то ближе к

if (a == 0)
    return 0;

, которое правильно говорит: «Если число равно нулю, сумма его цифр равна нулю».

Точно так же взгляните на последнюю строку вашей функции:

f = (a% 10) + sum (a/10);

Опять же, ваша интуиция точная: сумма цифр числа дается суммой его первой цифры исумма остальных его цифр.Однако обратите внимание, что хотя вы правильно вычисляете сумму цифр, вы не правильно возвращаете сумму цифр.На самом деле, вы ничего не возвращаете, если выполняете этот код, поэтому возвращаемое значение из функции не определено, поэтому вывод мусора.Чтобы исправить это, рассмотрите возможность переписать код следующим образом:

return (a % 10) + sum (a / 10);

Это фактически говорит о необходимости вернуть значение, которое вы только что сгенерировали прямо здесь, вместо того, чтобы хранить его в локальной переменной, которая будет немедленно очищена каккак только функция вернется.

Я полагаю, что причина, по которой вы закодировали эту функцию таким образом, заключается в том, что у вас сложилось впечатление, что значение int f; передается через вызовы функций.К сожалению это не так.При написании рекурсивной функции каждый экземпляр функции полностью независим от каждого другого экземпляра, а локальные переменные, доступные в одном рекурсивном вызове, не доступны в других рекурсивных вызовах.Следовательно, хотя каждый рекурсивный вызов имеет свою собственную переменную int f, все эти переменные полностью независимы друг от друга.Значение не переносится через них.Если вы хотите передать значения через рекурсивные функции, лучший способ сделать это - использовать возвращаемое значение рекурсивных вызовов или (если необходимо), передав указатель на какое-то значение через рекурсию.

Надеюсь, это поможет!

4 голосов
/ 12 августа 2011

Когда a равно 0, вы возвращаете неинициализированное значение (f не было инициализировано).

Измените его на:

if (a == 0)
        return 0;

Вы также забыли возврат в конце функции:

return (a% 10) + sum (a/10);

Настоятельно рекомендуется всегда компилировать с флагом -Wall, который предупредит вас об этих ошибках.

2 голосов
/ 12 августа 2011

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

int sum (int a) {
  if (a == 0) {
    return 0;
  }
  return (a% 10) + sum(a/10);
}
1 голос
/ 12 августа 2011
return a == 0 ? 0 : ((a% 10) + sum (a/10));
0 голосов
/ 12 августа 2011

Вы только возвращаете f, если это 0, но не если это не так, что делает ваше возвращаемое значение неопределенным.Я предполагаю, что вы хотите сделать:

int sum (int a) {

    int f;

    if (a == 0)
        return 0;

    f = (a % 10) + sum (a / 10);

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