2013-08-30 2 views
1

Для нашей деятельности сегодня нам было поручено использовать рекурсию с суммой цифр. Я уже сделал эту программу:Сумма цифр с использованием рекурсии в C

int main() 

{ 
int num = 0, sum; 

printf("Enter an integer: "); 
scanf("%d",&num); 

//counter=1; 

for (sum=0; num>0;) 

{ 
    sum = sum + num % 10; 
    num = num /10; 
    } 
printf("Sum = %d", sum); 

getch(); 
return 0; 

} 

Наш преподаватель добавил: «Вход и выход должны выполняться в функции main()». Правильно ли поступаешь? Или я что-то пропустил в своем коде?

+4

Это итерационное ('for' loop) решение и не использует рекурсию. – FrankPl

ответ

2

Чтобы сделать рекурсию, создайте функцию, которая рекурсирует, а не использует цикл for.

int SumDigits(int i) { 
    if (i < 10) { 
    return i; 
    } 
    else { 
    return i%10 + SumDigits(i/10); 
    } 
} 


scanf("%d", &i); 
printf("%d\n", SumDigits(i)); 
+0

Я абсолютно ненавижу с удвоенной силой 'if ... return ... else' construct :-) – paxdiablo

+0

@paxdiablo Я не использую его много. Кажется, легче понять для новых людей. Я предпочитаю стиль вашего сообщения или - gasp - 'return (i <10)? foo: bar; ' – chux

1

У вас есть итеративное решение, а не рекурсивное.

Рекурсия включает определение проблем с точки зрения более простой версии проблемы, все время работающей в направлении фиксированной конечной точки.

Фиксированная конечная точка в этом случае представляет собой любое число, меньшее 10, для которого значение является этой цифрой.

Переход к более простому случаю (для чисел больше 9) - это просто добавить наименее значащую цифру в результат числа, деленного на десять (целочисленное деление).

Так как это классная работа, псевдокод только я боюсь.

def digitSum (n): 
    if n < 10: 
     return n 
    return (n % 10) + digitSum (n/10) 

Если вы будете следовать, что для числа 314, вы увидите, что происходит.

  • На уровне рекурсии один, n == 314 поэтому рассчитывает 314 % 10 получить 4 и вызывает digitSum(31).
    • На уровне рекурсии два, n == 31 поэтому он рассчитывает 31 % 10 для получения 1 и звонит digitSum(3).
      • На третьем уровне рекурсии, n == 3 так он просто возвращает 3
    • Резервное копирование на два уровня, который добавляется к запоминаемой 1 и вернулся в 4.
  • Обратно на уровень один, это добавлено к запомненному 4 и возвращено как 8.

Следовательно, вы получите цифру 8 на номер 314.