2014-08-27 3 views
7

Обратные значения 2-мерной матрицы, которые могут растягиваться n раз.Javascript Упражнение - Обратный 2-мерный массив

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

Дано:

  1. Все массивы всегда имеют длину 2
  2. Последний массив в списке будет содержать индекс 1 нуль

Пример:

  • [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/

Я ни в коем случае не яваскрипт эксперта, поэтому мне было интересно, есть ли лучший способ сделать это?

+1

ли массив всегда заканчивается в 'null'? Кроме того, ваш пример, похоже, оставляет это из окончательного результата. –

+1

Я не уверен, что «2D» и «обратный» здесь являются правильными условиями. Это вложенный массив, и вы, не имея лучшего термина, выворачиваете его наизнанку. –

+0

Этот вопрос не соответствует теме, потому что он принадлежит http://codereview.stackexchange.com/ –

ответ

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]]]) 

On последний звонок, arr - null (это основной корпус), поэтому он просто возвращает acc, whi ch имеет значение [3, [2, [1, null]]].

Следует упомянуть, что эта структура вложенных массивов в основном представляет собой cons list, который широко используется в функциональном программировании и очень способствует рекурсивным операциям.

Наконец, вот итеративный версия:

function r(arr) { 
    var acc = null; 
    while (arr) { 
     acc = [arr[0], acc]; 
     arr = arr[1]; 
    } 
    return acc; 
} 
Смежные вопросы