这实际上是如何根据第一原理定义自然数算术的;见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。如果我们不知道解决问题的方法,那么我们就会犯一个小问题;如果我们采用第二个加数的先驱,那么我们离我们知道如何解决的问题更近一步。
是整数总是积极的? –
是的。它们是非负的 –
“++”和“ - ”运算符是否重要? ':)' –