我正在尝试创建一个递归方法,使用 Horner 算法将以 n 为基数的小数转换为以 10 为基数的小数。我在这里和各处进行了搜索,但找不到任何详细处理小数部分的地方。需要注意的是,我在递归方面非常薄弱,因为我还没有在编程课程中正式学习它,但已被另一个课程分配。
我能够创建一个方法来处理数字的整数部分,而不是小数部分。
我觉得我写的方法相当接近,因为它让我将测试数字的答案加倍(也许是因为我正在测试基数 2)。
传递的第一个参数是一个填充系数的 int 数组。我不太关心系数的顺序,因为我使所有系数相同来测试它。
第二个参数是基数。第三个参数初始化为系数数减 1,我也将其用于整数部分方法。我尝试使用系数的数量,但这超出了数组。
我尝试再除一次基数,因为这会给我正确的答案,但如果我在基本情况返回语句或最终返回语句末尾这样做,它就不起作用。
所以,当我尝试转换时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]
. Since coef[it] >= 1
在您的测试中,它将始终返回大于或等于 1 的数字。
解决起来相对容易:将两者分开coef[it]
by 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;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)