Javascript Exercise - 反向二维数组

时间:2014-08-27 17:24:16

标签: javascript arrays

反转可能延长n次的二维数组的值。

[1, [2, [3, ... [n, null]]]]

鉴于:

  1. 所有数组的长度始终为2
  2. 列表中的最后一个数组将包含索引1为null
  3. 示例:

    • [1, [2, [3, null]]]将输出[3, [2, [1, null]]]
    • [1, [2, [3, [4, null]]]]会输出[4, [3, [2, [1, null]]]]

    我不确定我是否正确描述它但是今天我遇到了这个练习并提出了一个相当明显的解决方案。

    var ars = [1, [2, [3, null]]], rev = null;
    
    function r(x) {
        rev = (rev == null) ? [x[0]] : [x[0], rev];
        if( x[1] !== null )
            r(x[1]);
    }
    r(ars);
    console.log( rev );
    

    http://jsfiddle.net/5b4xntwg/

    我绝不是一个javascript专家,所以我想知道是否有更好的方法来做到这一点?

1 个答案:

答案 0 :(得分:8)

这是一种更简洁的方法,没有副作用:

function r(arr, acc) {
    acc = acc || null;
    return arr ? r(arr[1], [arr[0], acc]) : acc;
}

http://jsfiddle.net/5b4xntwg/1/

它通过以下递归调用输入[1, [2, [3, null]]]

r([1, [2, [3, null]]]                     )
r([2, [3, null]]     , [1, null]          )
r([3, null]          , [2, [1, null]]     )
r(null               , [3, [2, [1, null]]])

在最后一次通话中,arrnull(这是基本情况),因此只返回acc,其值为[3, [2, [1, null]]]

值得一提的是,这个嵌套数组结构基本上是cons list,它在函数式编程中得到了广泛的应用,非常有利于递归操作。

最后,这是一个迭代版本:

function r(arr) {
    var acc = null;
    while (arr) { 
        acc = [arr[0], acc]; 
        arr = arr[1]; 
    }
    return acc;
}