2015-08-31 70 views
1

試圖遞歸交換數組中的對,並設法迭代獲取它。 我將如何遞歸實現交換部分?我想我的大部分都是正確的!如果有奇數,最後一個保持不變。如果可能的話,我不想有助手交換功能。遞歸交換數組中的對

pairSwap = function(arr) { 
     var newArray = [] 
     for (var i = 0; i < arr.length; i += 2) { 
     var current = arr[i]; 
     var next = arr[i + 1] 
     if (next !== undefined) { 
      newArray.push(next) 
     } 
     if (current !== undefined) { 
      newArray.push(current) 
     }; 
     }; 
     return newArray; 
    } 

    console.log(pairSwap([1, 2, 3, 4, 5])) 
    pairSwapRecursive = function(arr) { 

     if (arr.length < 2) { 
     return arr; 
     } else { 
     //swap the first and second: 
     return (swap ?) + pairSwapRecursive(arr.slice(2)) 

     } 


    } 

    console.log(pairSwapRecursive([1, 2, 3, 4, 5])) //should return [2, 1, 4, 3, 5] 

//something similar in Java: 

    // public String swapPairs(String s) { 
    //  if (s.length() < 2) 
    //   return s; 
    //  else 
    //   return swap(s.charAt(0), s.charAt(1)) + swapPairs(s.substring(2)); 
    // } 
+0

不需要輔助函數的原因是什麼? –

+0

@torazaburo純遞歸:)這是一個學習練習。 – devdropper87

回答

2

我不希望如果可能的話,以具有助手交換功能。

而且你不需要它 - 簡單地返回第二和第一個元素,你就大功告成了:

var pairSwapRecursive = function(arr) { 
    if (arr.length < 2) { 
     return arr; 
    } 

    return [arr[1], arr[0]].concat(pairSwapRecursive(arr.slice(2))); 
}; 

所以任何其他遞歸算法是:

  1. 不一小部分工作。在這種情況下 - 它將返回一個包含2個交換元素的數組。
  2. 調用本身,其餘

的jsfiddle:http://jsfiddle.net/am8rz1jx/

0

在@zerkms方案的精神,這裏是可逆轉的任何長度的塊版本:

function reverse_chunks(n) { 

    return function _reverse_chunks(arr) { 
    if (!arr.length) return arr; 
    return arr.slice(0, n).reverse().concat(_reverse_chunks(arr.slice(n))); 
    }; 

} 

reverser = reverse_chunks(2); 
reverser([1, 2, 3, 4]) 

如果」 d使它更有語義和可讀性,並轉移到ES6:

function reverse_chunks(n) { 

    return function _reverse_chunks(arr) { 
    var [head, tail] = [arr.slice(0, n), arr.slice(n)]; 
    if (!arr.length) return []; 
    return [ ...head.reverse(), ..._reverse_chunks(tail) ]; 
    }; 

} 

如果你願意,你也可以用函數參數這置換每個塊的元素:

function permute_chunks(n = 2, permute = arr => arr.reverse()) { 

    return function _permute_chunks(arr) { 
    var [head, tail] = [arr.slice(0, n), arr.slice(n)]; 
    if (!arr.length) return []; 
    return [ ...permute(head), ..._permute_chunks(tail) ]; 
    }; 

} 

然後

permuter = permute_chunks(5, arr => arr.sort()); 

將五行的每個塊進行排序。