4

我做了一个我认为是递归的例子。这可以接受吗?这不是为了一个项目或任何东西,我的教授太糟糕了,所以我试着自学。

public void theCat() {
  int i;
  for (i = 0; i <= 50; i++) {
    System.out.println(i);
    if (i == 10) {
      theCat();
    }
  }
}
4

5 回答 5

7

是的,这就是递归。但是,它将是无限的,因为您永远不会停止它。

你应该做的是有一个基本情况,你检查是否是时候停止递归了。您还将有一个缩减步骤,它将参数收敛到基本情况,如下所示:

public int theCat(int i) {
    if (i => 50) 
        return i;
    else
        return theCat(i + 1);
}

为了证明这一点的有效性,看一下递归阶乘方法:

private long factorial(int n) {
    if (n == 1)
        return 1;
    else
        return n * factorial(n-1);
}

在这里,基本情况检查我们是否正在尝试计算1!并在这种情况下返回1。这是我们不再需要递归调用该方法的情况。相反,我们沿着我们为计算最终答案所做的所有方法调用向后走:

factorial(5) 
  factorial(4) 
    factorial(3) 
      factorial(2) 
        factorial(1) 
          return 1 
        return 2*1 = 2 
      return 3*2 = 6 
    return 4*6 = 24 
  return 5*24 = 120
于 2013-10-30T19:04:22.457 回答
0

这会导致溢出。所有递归都应该有某种退出的基本情况,这样它就不会无限地进行。
此外,所有递归函数通常都会接收某种 int 或某个值,以便它们可以在基本情况下使用该值并退出。因此,对于您的示例,我会将 int i 作为参数发送到 cat 并在何时停止i == 50

于 2013-10-30T19:04:59.083 回答
0

是和不是。从技术上讲,这是递归的一个例子。但这永远不会终止。通常有一些参数传递给递归方法,以便它可以识别不会递归的“基本情况”。

于 2013-10-30T19:05:16.743 回答
0

是的,但是您必须有确定退出方法的标志,否则您会捕获StackOverFlowError

于 2013-10-30T19:06:11.030 回答
0

这将导致堆栈溢出,因为递归调用是无限的。

我们可以这样定义递归: 1. 我们从一个具有特定状态的方法开始 2. 在这个方法内部,方法本身被调用,但是调用改变了方法的状态 3. 方法有一个基本情况(a如果方法达到此状态,则不再递归调用自身)。

于 2013-10-30T19:16:19.453 回答