Horner的小数部分递归算法 - Java

时间:2012-09-16 05:22:04

标签: java algorithm recursion

我正在尝试创建一个递归方法,该方法使用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];
}

1 个答案:

答案 0 :(得分:5)

观察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;
}