Давайте посмотрим на эту рекурсивную функцию более подробно:
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
, все эти переменные полностью независимы друг от друга.Значение не переносится через них.Если вы хотите передать значения через рекурсивные функции, лучший способ сделать это - использовать возвращаемое значение рекурсивных вызовов или (если необходимо), передав указатель на какое-то значение через рекурсию.
Надеюсь, это поможет!