объясните как работает эта рекурсия

using System;

namespace ConsoleApp1
{
    class Program
    {
  
    static void Main(string[] args)
    {
        Console.WriteLine(SumCyfr(477));
    }
    static long SumCyfr(long a) // рекурсивный метод
    {          
        if (a == 0)
            return 0; 
        else
            return SumCyfr(a / 10) + a % 10;
   }
}
}

Заранее скажу
я понимаю, что %10 дает последнее число и /10 отсекает последнее число(в целочисленном типе), но не могу почему-то понять как это работает даже с отладкой, скорее всего упускаю что-то очевидное.


Ответы (2 шт):

Автор решения: Andrew

Учимся понимать код при помощи дебага:

  1. ставишь брейппоинт перед первым вызовом функции
  2. запускаешь под дебагом (ф5, НО НЕ Ctrl+F5!!! )
  3. смотришь на все значения переменных
  4. нажимаешь ф11
  5. Повторять пункты 3 и 4 пока не поймешь как все работает

Если все равно непонятно -- можно ввести 4 переменные посредника - каждая переменная на одно атомарное(максимально простое) действие.

static long SumCyfr(long a) // рекурсивный метод
{          
    if (a == 0)
        return 0; 
    else
    {
        var a1 = a / 10;
        var a2 = SumCyfr(a1);
        var a3 = a % 10
        var rez = a2 + a3;

        return rez;
    }
}

и повторить все действия с дебагом.

→ Ссылка
Автор решения: Битный овощ

477%10 + 47%10 + 4%10 + 0(т.к. 4/10=0)= 18

при a = 0 функция заканчивается. В другом случае оно возвращает последнюю цифру числа a + суммуцифр(a/10) и так по кругу, пока числа a не станет ровно нулю.

→ Ссылка