7

我正在尝试创建一种递归方法,该方法使用霍纳算法将以 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];
}
4

1 回答 1

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;
}
于 2012-09-16T05:44:43.060 回答