带有递归的java堆栈溢出异常
我正在尝试制作一个计算双阶乘的程序(示例-n=3,=>;(3!)!=6! = 720)但我在递归底部遇到了一些问题,并且出现了堆栈溢出异常
public static long df(long n) {
if (n == 1) {
return 1;
} else {
return df(n * df(n - 1));
}
}
public static void main(String[] args) {
System.out.println(df(3));
}
# 1 楼答案
我认为你应该在阶乘的帮助下使用相互递归
一般的g-阶乘函数可以构成阶乘
g
次:具体的双阶乘可以是
gf(n, 2)
:阶乘辅助函数:
现在测试:
# 2 楼答案
我们可以做到:
如果需要,通过一些技巧将其转化为单一方法:
但这是一个无用的函数,因为它只适用于n<;4--一旦我们到达(4!)!,我们超出了Java
long
类型的限制:如果希望此函数有用,可以使用浮动近似方程。但在近似值上再次调用近似阶乘可能没有多大意义。对于嵌套的阶乘值本身,需要一个浮动近似方程
或者,我们可以切换到^{:
用法
但这只涉及(7!)!在我们得到
java.lang.StackOverflowError
之前!如果我们想更进一步,我们需要转储递归并迭代计算阶乘:用法
# 3 楼答案
首先,定义阶乘函数:
通过Jupyter:
在定义函数之后:
Factorielle-Algorythme
# 4 楼答案
你遇到了一个无限循环
df(n * df(n - 1));
n * df(n-1)
将计算阶乘,而您无意中将答案反馈回递归方法,导致它永远持续下去改变
到
对于阶乘,你应该得到正确的结果
一旦有了这个有效的递归阶乘方法,只需使用
df(df(3))
就可以更容易地创建双阶乘