2012-10-10 21 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;