这实际上是从第一原理定义自然数算术的方式;见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 是一个。如果我们不知道问题的解决方案,那么我们会提出一个较小的问题;如果我们采用第二个加法的先行者,那么我们离我们知道如何解决的问题又近了一步。