Это на самом деле то, как арифметика натурального числа определяется из первых принципов; см. http://en.wikipedia.org/wiki/Peano_axioms
Давайте сделаем это с нуля, почему бы и нет?
- Нулевой естественный
- Ноль не имеет предшественника
- Каждое физическое имеет преемника
легко сделать:
sealed class Natural
{
private Natural predecessor;
private Natural(Natural predecessor)
{
this.predecessor = predecessor;
}
// Zero has no predecessor
public readonly static Natural Zero = new Natural(null);
// Every number has a successor; the predecessor of that number is this number.
public Natural Successor()
{
return new Natural(this);
}
public Natural Predecessor()
{
return this.predecessor;
}
public override string ToString()
{
if (this == Zero)
return "0";
else
return "S" + this.Predecessor().ToString();
}
Хорошо, мы можем представлять любое целое число, как это. Теперь как мы делаем дополнение? Определим сложение как:
a + 0 --> a
a + S(b) --> S(a + b)
Итак, давайте добавить оператор
public static Natural operator+(Natural a, Natural b)
{
if (b == Zero)
return a;
else
return (a + b.Predecessor()).Successor();
}
}
Хорошо, давайте попробуем.
Natural n0 = Natural.Zero;
Natural n1 = n0.Successor();
Natural n2 = n1.Successor();
Console.WriteLine(n0 + n0);
Console.WriteLine(n0 + n1);
Console.WriteLine(n0 + n2);
Console.WriteLine(n1 + n0);
Console.WriteLine(n1 + n1);
Console.WriteLine(n1 + n2);
Console.WriteLine(n2 + n0);
Console.WriteLine(n2 + n1);
Console.WriteLine(n2 + n2); // SSSS0
И вот вы, два плюс два, на самом деле четыре.
Если вы заинтересованы в этом вопросе, я в настоящее время выполняю длинную серию в своем блоге о выводе натуральной и целочисленной арифметики с нуля, хотя я использую двоичное представление, а не унарное представление.См
http://ericlippert.com/2013/09/16/math-from-scratch-part-one/
Более общо: вопрос предназначен для проверки, знаете ли вы базовую структуру рекурсивного метода; возможно, вы не позволите мне выложить это для вас. Рекурсивные методы в C# все следуют этой схеме:
- Мы уже знаем решение проблемы без рекурсии? Если да, то разрешите проблему и верните результат.
- Мы не знаем решение проблемы. Разделите проблему на одну или несколько более мелких проблем. Редукция должна создавать проблемы, которые на самом деле меньше, то есть ближе к проблеме, которая имеет известное решение. В противном случае рекурсия не заканчивается.
- Решите каждую проблему рекурсивно.
- Объедините решения этих проблем, чтобы создать решение для большей проблемы.
- Верните результат.
Это то, что мы делаем в операторе добавления. Сначала мы проверим, известно ли нам решение проблемы; a + 0 является a. Если мы не знаем решения проблемы, мы делаем меньшую проблему; если мы возьмем предшественника второго слагаемого, то мы на один шаг ближе к проблеме, которую мы знаем, как ее решить.
ли целые числа всегда положителен? –
Да. Они неотрицательны –
Учитываются ли операторы '++' и '--'? ':)' –