一尘不染

霍纳的小数部分递归算法-Java

algorithm

我正在尝试创建一种递归方法,该方法使用霍纳算法将以n为底的小数转换为以10为底。我在这里和各处进行了搜索,但是找不到任何详细处理小数部分的地方。请注意,我的递归能力很弱,因为我尚未在编程类中正式学习它,但已由另一类分配了它。

我能够制作一个方法来处理数字的整数部分,而不是小数部分。

我觉得我所写的方法相当接近,因为它使我可以将测试数字的答案加倍(也许是因为我正在测试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];
}

阅读 250

收藏
2020-07-28

共1个答案

一尘不染

请注意,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;
}
2020-07-28