我需要使用递归来计算玩家得到多少奖牌,例如,如果我输入3,玩家获得8枚奖牌[Ex1。(3+(3-1)+3)=(3 + 2 + 3)= 8] / [Ex2。(5 +(5-1)+5)=(5 + 4 + 5)= 14]当我在主方法上输入1进行测试时它可以工作但是当我改变一个大于1的数字时崩溃,我得到红色字母作为错误这是我得到的错误。我已经完成了大约5种递归方法,但我仍然坚持这一方法。
java.lang.StackOverflowError
at RecursiveFunctions.countMedals(RecursiveFunctions.java:87)
public class RecursiveFunctions{
public static int countMedals(int n){
if(n==0){
return 1+(1-1)+1;
}
else{
return countMedals((n)+(n-1)+(n));
}
public static void main(String[] args){
System.out.println("Number of Medals: " + RecursiveFunctions.countMedals(3));
}
}
答案 0 :(得分:6)
尝试追踪该功能,看看会发生什么:
countMedals(3) returns countMedals(3 + 2 + 3)
countMedals(8) returns countMedals(8 + 7 + 8)
这将持续增长,永远不会达到0的基本情况。
答案 1 :(得分:4)
您的公式没有递归逻辑。没有迭代,它只是一个简单的数学方程式。
public static int countMedals(int n){ return 3*n - 1;}
答案 2 :(得分:2)
递归方法在递归调用中没有端点。 你打电话:
countMedals((n)+(n-1)+(n))
如果n为2,则此表达式求值:
countMedals((2)+(2-1)+(2)) -> countMedals(5)
这是:
countMedals((5)+(5-1)+(5)) -> countMedals(14)
等等......你永远不会停止。所以堆栈已满,Java崩溃。
答案 3 :(得分:2)
从您的代码中,您似乎永远无法达到n == 0
的情况。这就是你进入无限递归的原因。
每次使用n + (n - 1) + n
调用您的函数时,基本上是3n - 1
。所以你拥有的是f(n) = 3n - 1
,并且你将结果传递给函数本身。现在f(n) = 0
仅在n = 1 / 3
时出现。你能看到n
可以1 / 3
的任何方式吗?
另外,尝试在图表上绘制此功能。当您不断增加y
(在这种情况下基本为x
)时,您认为n
值会发生什么变化?
答案 4 :(得分:2)
我不知道如何应用这样的递归。要计算f(n),你需要计算f(3n-1),你需要计算f(f(3n-1))等。它永远不会终止,所以你得到堆栈溢出。
事实上,如果f(3)和f(5)都= 3n-1,我根本不知道你为什么要递归。显然你没有正确理解你的问题。