Horner的小数部分递归算法 – Java
我正在尝试创建一个递归方法,使用Horner的算法将基数n中的小数转换为基数10.我在这里搜索过,但是找不到任何处理小数部分的细节。 作为一个抬头,我在递归时非常弱,因为我还没有在我的编程课程中正式学习它,但是已经被另一个类分配了它。
我能够创建一个方法来处理数字的整数部分,而不是小数部分。
我觉得我写的方法非常接近,因为它让我的测试数字的答案加倍(可能是因为我测试的是基数2)。
传递的第一个参数是一个填充系数的int数组。 我并不太关心系数的顺序,因为我正在使所有系数相同以测试它。
第二个参数是基础。 第三个参数初始化为系数减1,我也用于整数部分方法。 我尝试使用系数的数量,但这是从数组中走出来的。
我尝试将基数再划分一次,因为这会给我正确的答案,但如果我在基本案例返回语句或最终返回语句的末尾这样做,它就不起作用。
因此,当我尝试将0.1111 base 2转换为base 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; }