我正在尝试创建一种递归方法,该方法使用 Horner 算法将以 n 为底的小数转换为以 10 为底的小数。我在这里和所有地方都进行了搜索,但找不到任何地方详细处理小数部分。提醒一下,我在递归方面很弱,因为我还没有在我的编程课上正式学习它,但已经被另一个类(class)分配了。
我能够创建一个方法来处理数字的整数部分,而不是小数部分。
我觉得我写的方法相当接近,因为它让我的测试数字的答案加倍(可能是因为我正在测试基数 2)。
传递的第一个参数是一个填充有系数的 int 数组。我不太关心系数的顺序,因为我正在使所有系数相同以对其进行测试。
第二个参数是基础。第三个参数初始化为系数数减 1,我也将其用于整数部分方法。我尝试使用系数的数量,但它超出了数组。
我又尝试了一次除以基数,因为这会给我正确的答案,但如果我在基本情况 return 语句中或在最终 return 语句的末尾这样做,它就不起作用了。
因此,当我尝试将 0.1111 以 2 为底数转换为以 10 为底数时,我的方法返回 1.875(0.9375 的正确答案的两倍) .
如有任何提示,我们将不胜感激!
//TL;DR
coef[0] = 1; coef[1] = 1; coef[2] = 1; coef[3] = 1;
base = 2; it = 3;
//results in 1.875 instead of the correct 0.9375
public static double fracHorner(int[] coef, int base, int it) {
if (it == 0) {
return coef[it];
}
return ((float)1/base * fracHorner(coef, base, it-1)) + coef[it];
}
最佳答案
观察 fracHorner
总是返回一个至少等于 coef[it]
的值,因为它要么返回 coef[it]
要么返回正数添加到 coef[it]
。由于 coef[it] >= 1
在您的测试中,它将始终返回大于或等于 1 的数字。
修复起来相对容易:将 coef[it]
除以 base
:
public static double fracHorner(int[] coef, int base, int it) {
if (it == 0) {
return ((double)coef[it])/base;
}
return (fracHorner(coef, base, it-1) + coef[it])/base;
}
关于java - Horner 的小数部分递归算法 - Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12444587/