我做了我认为是递归的一个例子。这可以接受吗?这不是一个项目或任何东西,我的教授只是很糟糕,所以我试图教我自己。这是递归的正确使用吗?
public void theCat() {
int i;
for (i = 0; i <= 50; i++) {
System.out.println(i);
if (i == 10) {
theCat();
}
}
}
我做了我认为是递归的一个例子。这可以接受吗?这不是一个项目或任何东西,我的教授只是很糟糕,所以我试图教我自己。这是递归的正确使用吗?
public void theCat() {
int i;
for (i = 0; i <= 50; i++) {
System.out.println(i);
if (i == 10) {
theCat();
}
}
}
是的,这是递归。然而,这将是无限的,因为你永远不会停止它。
你应该做的是有一个基本的情况下,你检查是否是时候停止递归。您也将有一个还原步骤,将汇聚的参数对基本情况,就像这样:
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
您可以告诉我一个您的意思吗?我想我明白,但我想确定。 –
现在,这使得更多的意义,谢谢。 –
实际上这会抛出'StackOverflowError'大于50的值:) – nachokk
这将导致溢出。所有递归都应该有一些退出的基本情况,这样它就不会无限地走下去。
此外,所有递归函数通常会接收某种类型的int或某个值,以便它们可以在基本情况下使用该值并退出。因此,对于你的例子,我会发int i作为参数到猫并停止时i == 50
是的,没有。从技术上讲,这是递归的一个例子。但这永远不会终止。通常有一些参数传递给递归方法,以便它可以识别不会递归的“基本情况”。
是的,但你必须有决定从你的方法出口标志,否则你赶上StackOverFlowError
这将导致堆栈溢出的递归调用是无限的。
我们可以这样定义递归: 1.我们开始与具有特定状态 2.本方法中的方法本身被称为方法,但电话改变了方法的状态 3.方法有一个基本情况(如果一个方法达到这个状态,它不会再递归地调用它自己)。
我不认为这是有效的递归。 http://introcs.cs.princeton.edu/java/23recursion/ – kosa
它是_infinite_递归。 – GriffeyDog
从技术上讲,您正在进行函数调用。但是这里没有任何用途递归。 – Stieffers