您的方法在这里有很多问题已经被其他人解决了,所以我会回答一个您应该问但没有问的问题:
为了正确使用递归,问题必须具备哪些特征?
除非您的解决方案具有以下所有特征,否则不得使用递归:
- 该问题有一个“简单”的版本,无需递归即可解决。
- 每个不平凡的问题都可以简化为一个或多个严格更小的问题。
- 反复将一个问题简化为一个较小的问题最终会导致尝试解决一个微不足道的问题,经过少量步骤,其中“小”我们的意思是,比如说,几百步,而不是几百万。(这个条件可以在“尾递归”语言中放宽;C# 不是尾递归语言。)
- 小问题的解决方案总是可以有效地组合成大问题的解决方案。
您的示例代码没有表现出这些特征;使用递归要求您展示所有这些特征,因此在任何情况下都不应使用递归。
让我举一个例子,说明一个可以通过递归很好地解决的问题:
一棵树要么是空的,要么由左右子树组成;树从不包含循环。一棵空树的高度为零;非空树的高度是从根到“最深”的空子树的最长路径的长度。编写一个确定树高度的方法,假设高度小于 200。
这个问题展示了可以用递归解决的问题的所有特征,所以我们可以这样做。每个递归程序都有以下模式:
- 如果可以的话,解决琐碎的问题。
- 否则,将问题分解为更小的问题,递归地解决它们,然后组合解决方案。
所以让我们这样做:
int Height(Tree tree)
{
// Trivial case:
if (tree.IsEmpty) return 0;
// Non-trivial case: reduce the problem to two smaller problems:
int leftHeight = Height(tree.Left);
int rightHeight = Height(tree.Right);
int height = Math.Max(leftHeight, rightHeight) + 1;
return height;
}