Напишите рекурсивную функцию сложения двух чисел, используя только добавление единицы
Что-то до меня не доходит как оно должно работать
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)