2012-10-10 57 views
0

什麼是錯用下面的代碼:的平方根二進制搜索陷入無限循環中的javascript

的CoffeeScript:

sqrt = (n) -> 
    small = 0.01 
    lo = 0 
    hi = (n+1)/2 
    while hi > lo 
     mid = (lo+hi)/2 
     diff = Math.pow(mid, 2) - n 
     sign = (diff > 0) ? 1 : 0 
     if Math.abs(diff) < small 
      return mid 
     else 
      switch sign 
       when 1 
        hi = mid 
       when 0 
        lo = mid 
console.log (sqrt 33) 

的Javascript:

// Generated by CoffeeScript 1.3.3 
(function() { 
    var sqrt; 

    sqrt = function(n) { 
    var diff, hi, lo, mid, sign, small, _ref; 
    small = 0.01; 
    lo = 0; 
    hi = (n + 1)/2; 
    debugger; 
    while (hi > lo) { 
     mid = (lo + hi)/2; 
     diff = Math.pow(mid, 2) - n; 
     sign = (_ref = diff > 0) != null ? _ref : { 
     1: 0 
     }; 
     if (Math.abs(diff) < small) { 
     return mid; 
     } else { 
     switch (sign) { 
      case 1: 
      hi = mid; 
      break; 
      case 0: 
      lo = mid; 
     } 
     } 
    } 
    }; 

    console.log(sqrt(33)); 

}).call(this); 

另一件事是,當你在無限循環或遞歸調用中,您甚至無法打開控制檯。瀏覽器只是凍結。這太令人討厭了。任何人都可以闡明這一點呢?

+0

「{1:0}」的結果是什麼? – sics

回答

2

這一部分:

sign = (diff > 0) ? 1 : 0 

應該是:

sign = if (diff > 0) then 1 else 0 

?是爲存在操作符保留的。

另請參閱:documentation

+0

Coffeescript不支持x?y:z語法或什麼?它真的會產生這樣的奇怪東西。我修復了生成的JavaScript代碼,問題就消失了。 – lkahtz

+0

@lkahtz CoffeeScript!= JavaScript :) –

+0

好的傑克,明白了〜 – lkahtz

0

因此你的CoffeeScript代碼

sign = (_ref = diff > 0) != null ? _ref : { 
    1: 0 
}; 

應該像

sign = (diff > 0) ? 1 : 0;