我正在尝试创建一种递归方法,该方法使用霍纳算法将以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]; }
请注意,fracHorner该值始终返回至少等于的值,coef[it]因为它要么返回coef[it]要么添加正值coef[it]。由于`coef[it]
fracHorner
coef[it]
= 1`在测试中,它将始终返回大于或等于1的数字。
修复起来相对容易:将它们coef[it]除以base:
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; }