简体   繁体   English

javascript:递归,方法已定义,但一直说它未定义

[英]javascript: recursion, method is defined, but it keeps on saying it's not defined

MergeSort.js MergeSort.js

var merge_sort = function(unsorted) {
  if (unsorted.length <= 1)
    return unsorted;

  var middle = unsorted.length / 2; 

  var left = unsorted.slice(0, middle - 1);
  var right = unsorted.slice(middle, unsorted - 1);

  left = merge_sort(left);
  right = merge_sort(right);

  return merge(left, right);
};

var merge = function(left, right) {
  var result = [];

  while(left.length > 0 || right.length > 0)
    if(left.length > 0 && right.length > 0) {
      if (left[0] <= right[0]) {
        result.push(left.shift());
      } else {
        result.push(right.shift());
      }
    } else if(left.length > 0) {
      result.push(left.shift());
    } else if(right.length > 0) {
      result.push(right.shift());
    }
  }

  return result;
};

MergeSortSpec.js MergeSortSpec.js

describe("#merge_sort", function() {

  it("should sort the unsorted array", function() {
    var unsorted = [8, 2, 10, 5, 4, 9, 7, 1, 6, 3];
    var sorted = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
    expect(merge_sort(unsorted)).toEqual(sorted);
  });

});

Error message 错误信息

ReferenceError: merge_sort is not defined
    at null.<anonymous> (file://localhost/Users/jasonkim/projects/algorithm-everyday/merge_sort/javascript/spec/MergeSortSpec.js:6:12)

I am not sure why jasmine.js is telling me that merge_sort is not defined. 我不确定为什么jasmine.js告诉我没有定义merge_sort Even though it's there. 即使它在那里。 Any idea why? 知道为什么吗?

SpecRunner.html SpecRunner.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
  "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
  <title>Jasmine Spec Runner</title>

  <link rel="shortcut icon" type="image/png" href="lib/jasmine-1.3.1/jasmine_favicon.png">
  <link rel="stylesheet" type="text/css" href="lib/jasmine-1.3.1/jasmine.css">
  <script type="text/javascript" src="lib/jasmine-1.3.1/jasmine.js"></script>
  <script type="text/javascript" src="lib/jasmine-1.3.1/jasmine-html.js"></script>

  <!-- include source files here... -->
  <script type="text/javascript" src="src/MergeSort.js"></script>

  <!-- include spec files here... -->
  <script type="text/javascript" src="spec/MergeSortSpec.js"></script>

  <script type="text/javascript">
    (function() {
      var jasmineEnv = jasmine.getEnv();
      jasmineEnv.updateInterval = 1000;

      var htmlReporter = new jasmine.HtmlReporter();

      jasmineEnv.addReporter(htmlReporter);

      jasmineEnv.specFilter = function(spec) {
        return htmlReporter.specFilter(spec);
      };

      var currentWindowOnload = window.onload;

      window.onload = function() {
        if (currentWindowOnload) {
          currentWindowOnload();
        }
        execJasmine();
      };

      function execJasmine() {
        jasmineEnv.execute();
      }

    })();
  </script>

</head>

<body>
</body>
</html>

Maybe the problem is the missing opening bracket at the start of the while loop? 也许问题是while循环开始时缺少左括号? If you fix that, it runs fine in jasmine (although the output is not correct) 如果您修复此问题,则在茉莉花中可以正常运行(尽管输出不正确)

var merge = function(left, right) {
    var result = [];

    while(left.length > 0 || right.length > 0) {
        if(left.length > 0 && right.length > 0) {
            if (left[0] <= right[0]) {
               result.push(left.shift());
            } else {
               result.push(right.shift());
            }
         } else if(left.length > 0) {
            result.push(left.shift());
         } else if(right.length > 0) {
            result.push(right.shift());
         }
     }

     return result;
};

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM