计算嵌套根常数的递归Java程序
使用下面的代码,我能够估计它高达:1.7579327566180045
public class Sum {
static int count = 0;
static double a = 0;
public static void main(String[] args) {
int x = 0;
System.out.println(sum(x));
}
public static double sum(int x){
count++;
x++;
if (count == 11000){
return a;
}
return a = Math.sqrt(x+sum(x));
}
然而,我无法通过这里的递归得到更准确的答案。从11000增加递归调用的数量会给我一个StackOverflowError
。我还查看了如何在这里使用java的BigDecimal
,但我无法在这里实现它,老实说,我不确定这是否有帮助
Question :- how can I make this programme compute the constant to more decimal places and more accurately? I'm not certain if this I can compute it iteratively or not either. I wasn't able to work out an
iterative
definition.
此外,我也研究了Java8流,但这些对我来说没有多大意义(因为我是编程和Java新手),也不确定这是否适用于这里
谢谢你的帮助
# 1 楼答案
如果正确地实现算法,您将获得更高的精度
编辑:您的实现没有错误,但我不会这样做。。。(sum的第5行可以返回x的sqrt,而不是a,也可以是0。)
其次,以迭代方式完成这一切的关键是向后走
# 2 楼答案
如果您唯一的问题是堆栈:不要使用递归,只需使用普通迭代
如果我们调用迭代极限
n
,则根常数为:这与:
让我们用这个:
当然,由于您需要精度,这不会有多大帮助:现在您不再遇到堆栈问题,而是遇到了这样一个事实:IEEE浮点数不适用于数学上精确的计算:
根据official documentation的规定:
# 3 楼答案
从comment by Tibrogargan中提供的链接获取answer by Mike 'Pomax' Kamermans中的代码,使用answer by barwnikk中的算法将其转换为使用
BigDecimal
,您将得到以下代码:在1000次迭代中,您似乎获得了1596位精度。使用以下各项进行测试:
生成此输出:
超过4600个数字似乎无法打印,所以我停在那里。也开始变慢了。;-)