2015-10-15 86 views
0

這段代碼產生它下面的堆棧跟蹤:的RangeError:超過(巴貝爾Ramda)最大調用堆棧大小

import R from 'ramda'; 

function quicksort(list) { 
    if (R.isEmpty(list)) return list; 
    let pivot = R.head(list); 
    let lesser = R.filter(e => e < pivot , list); 
    let greater = R.filter(e => e >= pivot, list); 
    return R.concat(quicksort(lesser), pivot, quicksort(greater)); 
} 

var sorted = quicksort([2,3,1]); 
console.log(sorted); 

堆棧跟蹤:

$ babel-node quicksort2015.js 
/Users/ivan/.nvm/versions/node/v4.1.2/lib/node_modules/babel/node_modules/babel-core/node_modules/core-js/modules/es6.object.to-string.js:3 
var classof = require('./$.classof') 
        ^
RangeError: Maximum call stack size exceeded 
at Array.toString (native) 
at module.exports  
(/Users/ivan/.nvm/versions/node/v4.1.2/lib/node_modules/babel/node_modules/babel-core/node_modules/core-js/modules/$.cof.js:4:19) 
at module.exports  
(/Users/ivan/.nvm/versions/node/v4.1.2/lib/node_modules/babel/node_modules/babel-core/node_modules/core-js/modules/$.classof.js:13:13) 
at Array.toString (/Users/ivan/.nvm/versions/node/v4.1.2/lib/node_modules/babel/node_modules/babel-core/node_modules/core-js/modules/es6.object.to-string.js:8:25) 
at type (/Users/ivan/dev/quicksort/node_modules/ramda/dist/ramda.js:3345:100) 
at f1 (/Users/ivan/dev/quicksort/node_modules/ramda/dist/ramda.js:166:27) 
at _equals (/Users/ivan/dev/quicksort/node_modules/ramda/dist/ramda.js:4038:13) 
at equals (/Users/ivan/dev/quicksort/node_modules/ramda/dist/ramda.js:4664:16) 
at f2 (/Users/ivan/dev/quicksort/node_modules/ramda/dist/ramda.js:201:24) 
at Object.isEmpty (/Users/ivan/dev/quicksort/node_modules/ramda/dist/ramda.js:5220:29) 

我雖然是巴貝爾將處理尾調用優化?無論如何,這是一個很短的名單,它不應該那麼深,對嗎?

+0

感謝Scott下面的最終修正的代碼。 http://codepen.io/ivanoats/pen/ojGYxL?editors=001 – Ivan

回答

2

這可能是由於過濾了整個列表,而不是lessergreater的列表的尾部。

例如你可以嘗試像以下:

function quicksort(list) { 
    if (list.length <= 1) return list; 
    var x = R.head(list); 
    var xs = R.tail(list); 
    var lesser = R.filter(R.lt(R.__, x), xs); 
    var greater = R.filter(R.gte(R.__, x), xs); 
    return R.concat(quicksort(lesser), R.prepend(x, quicksort(greater))); 
} 

不幸的是這並沒有從尾部調用優化要麼受益,爲quicksort遞歸調用不是尾部調用位置。

+0

謝謝Scott!好的解決方案 – Ivan

相關問題