2017-02-28 59 views
0

我想製作bogosort功能。我想在每次輸出爲false時調用bogo函數。我試過用do {bogo function block} while(sorted===false)循環,但只循環一次(arr更改爲空數組)。最終目標是調用函數f.e bogo([1,5,3,2]),它應該輸出排序數組(在變量shuffled中)。javascript中的Bogosort函數循環

function bogo(arr) { 
 

 
    function shuffle(arr) { 
 
    var shuffled = []; 
 
    var rand; 
 
    while (arr.length !== 0) { 
 
     rand = Math.floor(Math.random() * arr.length) 
 
     shuffled.push(arr.splice(rand, 1)[0]); 
 
    } 
 
    return shuffled; 
 
    } 
 

 
    function sorted(shuffle) { 
 
    for (var i = 0; i < shuffle.length - 1; i++) { 
 
     if (shuffle[i] <= shuffle[i + 1]) { 
 
     continue; 
 
     } else { 
 
     return false; 
 
     } 
 
    } 
 
    return true 
 
    } 
 
    return sorted(shuffle(arr)); 
 
} 
 

 
console.log(bogo([1, 2]));

+0

你'sorted'功能不改變任何東西,數組如何進行排序?另外,'sorted'返回true或false ...不是(永遠不會)排序的數組 –

+0

yes是排序的目的是輸出布爾值。在這個假設下,while函數應該把當前的變量和顯示出來,但這只是我的理論。 – Felnyr

+0

你的代碼中唯一'while'在'shuffle' ...這是運行和完成的時間'sorted'被稱爲 –

回答

2

如果你想,直到它的排序洗牌數組,那麼你需要一個循環。你可以使用,,我認爲在這種情況下更具語義。

既然你在洗牌過程中破壞源陣列,您需要確保每一次新的洗牌數組傳遞,所以:

function bogo(arr) { 
 
    var shuffleCount = 0; 
 
    function shuffle(arr) { 
 
    var shuffled = []; 
 
    var rand; 
 
    while (arr.length !== 0) { 
 
     rand = Math.floor(Math.random() * arr.length) 
 
     shuffled.push(arr.splice(rand, 1)[0]); 
 
    } 
 
    return shuffled; 
 
    } 
 

 
    function sorted(shuffle) { 
 
    for (var i = 0; i < shuffle.length - 1; i++) { 
 
     if (shuffle[i] <= shuffle[i + 1]) { 
 
     continue; 
 
     } else { 
 
     return false; 
 
     } 
 
    } 
 
    return true 
 
    } 
 
    
 
    do { 
 
    shuffleCount++; 
 
    arr = shuffle(arr); 
 
    } while (!sorted(arr)) 
 
    
 
    return shuffleCount + ' | ' + arr.join(); 
 
} 
 

 
console.log(bogo([1, 2,3,4]));

+0

@是否有任何解決方案使用初始arr進行每次洗牌而不是洗牌? – Felnyr

+0

您需要修改* shuffle *函數以便將數組隨機混合,請參閱[*如何隨機化(混洗)JavaScript數組?](http://stackoverflow.com/questions/2450954/how-to-randomize -shuffle-A-JavaScript的陣列) – RobG