Javascript 只使用减法进行递归除法——不能处理小数

Javascript 只使用减法进行递归除法——不能处理小数,javascript,algorithm,math,Javascript,Algorithm,Math,我正在练习我的数学/算法技能,并试图只用减法来除两个数。我很接近,但我似乎不能处理小数,我不知道为什么?在堆栈的最底层,当我调用divide(9,2)时,我注意到我正在返回“0”,而实际上我想返回1/2-但不使用除法运算符。。。在if x小于y检查中,我应该在子程序中添加该逻辑吗?我被困在如何递归地在小数点后加上数字,最多加三位 var divide = function(x, y) { //the number of times you need to subtract

我正在练习我的数学/算法技能,并试图只用减法来除两个数。我很接近,但我似乎不能处理小数,我不知道为什么?在堆栈的最底层,当我调用divide(9,2)时,我注意到我正在返回“0”,而实际上我想返回1/2-但不使用除法运算符。。。在if x小于y检查中,我应该在子程序中添加该逻辑吗?我被困在如何递归地在小数点后加上数字,最多加三位

    var divide = function(x, y) {
        //the number of times you need to subtract y from x.

      if (y === 0) {
        return 0
      } 
      // if 
      if (x - y === 0) {
        return 1;
      } 
      if (x < y) {
    // if this is the case, get the value of y - x.  ->1
    var diff = y - x;
    console.log(diff);
    // add a zero to the end --> so in our case, 10
    diff = String(diff) + '0';
    console.log(diff);
    diff = Number(diff);
    console.log(diff);
    // is that now divisible by y? is so how many times? in our case, 5 times.
    var decimal = Number(divide(diff, y));
    var number = "." + decimal;
    //so add .5 to it.
    return number;
  } else {
        return (1 + divide(x - y, y)); 
      }

    };

    var modulo = function(x, y) {

      var val = x;
      while (val >= y) {
        val -= y;

      }
      return val;

    };
var divide=函数(x,y){
//需要从x中减去y的次数。
如果(y==0){
返回0
} 
//如果
如果(x-y==0){
返回1;
} 
if(x1
var-diff=y-x;
控制台日志(diff);
//在-->末尾加上一个零,因此在我们的例子中为10
diff=字符串(diff)+“0”;
控制台日志(diff);
diff=数量(diff);
控制台日志(diff);
//现在它可以被y整除吗?多少次?在我们的例子中,是5次。
var decimal=数字(除以(差值,y));
变量编号=“.”+小数;
//所以再加上1.5。
返回号码;
}否则{
返回(1+除以(x-y,y));
}
};
var模=函数(x,y){
var=x;
while(val>=y){
val-=y;
}
返回val;
};

发生这种情况是因为当x小于y时,将返回0。然而,这正是奇数除以2的结果-在最后一步中,算法将尝试将1除以2。在这种情况下,您需要实现逻辑,而不是简单地返回0

如果您不反对浮点错误,这将起到作用,而且不会出现
/
*
甚至
+

您可以设置精度,但如果再多几个数字,速度就会慢得令人恼火

它的工作原理是将商设置为x,然后重复从x中删除y个小部分,从商中删除y-1个小部分,直到x为0,商为x/y

函数除法(x,y){
变量符号=x<0^y<0?-1:1;
x=y?(x>0?x:0-x):-1;y=y>0?y:0-y;
var quot=x,prec=0.000001;
而(x>0)对于(var i=y-1,x=x-prec;i;i--,x-=prec,quot-=prec);
返回y?(符号>0?quot:0-quot):NaN;
}
警戒(除(9,2));
警戒(除(2,9));
警戒(除(9,-2));
警戒(除(-2,9));
警报(除法(-9,-2));
警报(除以(0,9));

警戒(除以(2,0))

你会考虑这种作弊行为吗?没有除法或乘法,加法变成了减法,它返回一个浮点,并使用递归。然而,有相当数量的字符串转换正在进行,以连接数字并添加符号和小数点

函数除法(x,y,prec){
如果(y==0),则返回NaN;
变量quot=0,符号=1;
如果(x<0){
符号=0-符号;
x=0-x;
}
if(y<0){
符号=0-符号;
y=0-y;
}
而(x>=y){
x-=y;
quot=0-(0-1-quot);
}
quot=(符号<0?-“:”).concat(quot,prec==未定义的&x>0?:”);
如果(x>0){
prec=prec | | 13;
如果(--prec){
对于(变量i=9,温度=x;i;i--)x=0-(0-x-temp);
quot=quot.concat(除以(x,y,prec));
}
}
返回浮点数(quot);
}
警戒(除(9,2));
警戒(除(2,9));
警戒(除(9,-2));
警戒(除(-2,9));
警报(除法(-9,-2));
警报(除以(0,9));

警戒(除以(9,0))您可能还希望以某种方式跟踪余数。是的,我正在更新以包含余数部分。是的,我在问题中确定了这一点。我能想到的唯一一件事就是返回x/y…。这里太难了。@devdropper87:你可以继续除法,将
0
加到数字的末尾(基本上是乘以10)。你的余数是1?加0得到10,除以2得到5,所以在小数点后,结果是0.5。@slebetman Only减法!相乘就是作弊:-)@m69:你可以用2的补码减法相乘:)