【问题标题】:Javascript Infinite loop and Recursion errorsJavascript无限循环和递归错误
【发布时间】:2013-09-06 22:17:46
【问题描述】:

我正在尝试使用 Javascript 编写排序算法。伪代码在我的链接中。这是我的 Go Playground 链接。 http://play.golang.org/p/wQwO6Wvd7b

如您所见,它适用于其他语言。 (我用相同的代码尝试了 Python、C、C++、Ruby、Go,它们都运行良好。)所以我用 Javascript 做了完全相同的事情,但它不起作用,我不知道为什么。感谢克里斯在我之前的帖子中:Javascript Sorting. Allocation fail process out of memory error

我发现我在 Javascript 中的代码超出了递归的索引限制,但我不知道为什么以及如何在 Javascript 中实现它,而其他语言只是在我编码时做正确的工作。 我肯定错过了 Javascript 和递归中的一些基本内容。 任何人都可以帮我弄清楚吗? (不是作业,只是独立自学)我对 Javascript 很陌生。

我认为我不需要在 Javascript 中进行排序,但我想知道我做错了什么。

以下是我用于错误检查的代码。

  var arr = [-1, 5, 7, 4, 0, 1, -5];
  console.log("Unsorted Array:", arr);
  console.log("# of elements in array:", arr.length)

  function Partition(arr, first_index, last_index) {
        console.log("---")  
        console.log("# of elements in array:", arr.length)
        console.log("First index is", first_index);
        console.log("Last index is", last_index);
        console.log("---")  
        var x = arr[last_index];
        var i = first_index - 1;

        for (var j = 0; j < arr.length-1; j++) {
              if (j > 100) {
                    console.log("Looping way too much.");
                    return;
              }
              if (arr[j] <= x) {
                    i += 1;
                    console.log("Swap index:", i, j);
                    var temp_1 = arr[i];
                    arr[i] = arr[j];
                    arr[j] = temp_1;
              }
        }
        console.log("Swap index:", (i+1), last_index);
        var temp_2 = arr[i+1];
        arr[i+1] = arr[last_index];
        arr[last_index] = temp_2;

        return i+1;
  }

  function QSort(arr, first_index, last_index) {
        console.log("QuickSort index:", first_index, last_index);

        if (first_index < last_index) {
              var mid = Partition(arr, first_index, last_index);
              QSort(arr, first_index, mid-1);
              QSort(arr, mid+1, last_index);
        }
  }

  QSort(arr, 0, arr.length-1);
  console.log("Sorted Array:", arr);

我猜下面是为什么循环太多了。 我发现我在递归方面做错了。

数组中的元素数:8
第一个索引是 2
最后一个索引是 6

交换指数:2 0
交换指数:3 2
交换指数:4 3
交换指数:5 4
掉期指数:6 5
掉期指数:7 6
掉期指数:8 6
快速排序索引:2 7

数组中的元素数:9
第一个索引是 2
最后一个索引是 7

不断地

【问题讨论】:

  • 很可能你有一些逻辑错误。 javascript 中的递归没有什么特别之处。
  • 我没有明白这一点,但您的数组长度可能会发生变化。也许试试for(var j=0,l=arr.length-1; j&lt;l; j++){。无论哪种方式,这在技术上都应该更快。同样i+=1; 与i++; 相同。

标签: javascript sorting loops memory-management recursion


【解决方案1】:

我不知道这在其他语言中会如何工作,因为这写得不正确。 partition 方法中的循环适用于整个数组,而实际上它应该只适用于被告知要处理的部分(在 first_index 和 last_index 之间)

这行代码:

for (var j = 0; j < arr.length-1; j++)

应该是:

for (var j = first_index; j < last_index; j++)

【讨论】:

  • 哦,谢谢你的接受。祝你在未来的编码工作中好运!
【解决方案2】:

Partition 函数内部的 for 循环应该写成:

for (var j = first_index; j &lt; last_index; j++) {...}

而不是

for (var j = 0; j &lt; arr.length-1; j++) {...}

从0 循环到arr.length-1 使其在原始数组中创建新元素,而不是仅仅交换它们。

【讨论】:

  • 非常感谢!有用。我在 Go 中做对了,但愚蠢地我在 Javascript 中做错了。谢谢百万!
【解决方案3】:

剧透警报 - 这个小提琴有一个快速排序的工作版本。我对你的版本有点挣扎,所以我自己写了。

诸如快速排序之类的算法为错误提供了很多机会(很多地方要差一个,等等)

作为一般建议,您可能希望通过传递数组来调用快速排序方法:

function quick_sort(array) {
    qsort(array, 0, array.length);
    console.log(array);
}

希望对你有帮助

http://jsfiddle.net/mwa4G/

http://en.literateprograms.org/Quicksort_(JavaScript)

【讨论】:

    猜你喜欢
    • 2016-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-15
    • 1970-01-01
    • 2014-10-13
    • 2020-02-08
    相关资源
    最近更新 更多