Напишите рекурсивную функцию сложения двух чисел, используя только добавление единицы

Что-то до меня не доходит как оно должно работать

static int sum(int a, int b)
        {           
            if ((b--) != 0)             
                return (a++);
            else if ((b--) == 0)
                return (sum(a, b));
        }
        static void Main(string[] args)
        {
            int a = 3;
            int b = 4;
            Console.WriteLine(sum(a, b));
        }

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

Автор решения: Stanislav Volodarskiy

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

Нужно думать аксиомами вроде (я, кстати, предполагаю что числа положительные):

a + 0 = a
a + b = (a + 1) + (b - 1)

Эти аксиомы и надо переложить в код:

static int sum(int a, int b) {
    if (b == 0) {
        // a + 0 = a
        return a;
    }
    // a + b = (a + 1) + (b - 1)
    return sum(a + 1, b - 1);
}

P.S. Код работает лучше если при написании повторять "метод математической индукции помоги!". Фактически аксиомы определяют сложение через ММИ.

P.P.S. В комментарии указали что я использовал операцию - 1, которая не была упомянута в задаче. Справедливое замечание, исправляюсь:

static int sum(int a, int b, int c = 0) {
    return (c == b) ? a : sum(a + 1, b, c + 1);
}

Решение основано на трёх правилах:

c = 0 => a + b - c = a + b
c = b => a + b - c = a
         a + b - c = (a + 1) + b - (c + 1)
→ Ссылка