2014-08-27 19 views
7

Odwróć wartości dwuwymiarowej tablicy, która może rozciągać się o n razy.Ćwiczenie JavaScript - Odwróć dwuwymiarową tablicę

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

Dane:

  1. Wszystkie tablice zawsze mieć długość 2
  2. Ostatnia matryca na liście zawiera indeks 1 null

przykład:

  • [1, [2, [3, null]]] wyświetli [3, [2, [1, null]]]
  • [1, [2, [3, [4, null]]]] byłoby wyjście [4, [3, [2, [1, null]]]]

Nie jestem pewien, czy mam rację, ale opisując go natknąłem tym ćwiczeniu dziś i wpadł na dość oczywiste rozwiązanie.

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/

jestem bynajmniej javascript ekspertem, więc zastanawiałem się, czy istnieje lepszy sposób to zrobić?

+1

Czy tablica zawsze kończyć się 'null'? Również twój przykład wydaje się pozostawić to z końcowego wyniku. –

+1

Nie jestem pewien, czy "2D" i "rewers" są tutaj właściwym pojęciem. To jest zagnieżdżona tablica, a dla braku lepszego terminu możesz ją odwrócić. –

+0

To pytanie wydaje się być nie na temat, ponieważ należy do http://codereview.stackexchange.com/ –

Odpowiedz

8

Oto bardziej zwięzły podejście, które nie mają skutków ubocznych:

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

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

To przechodzi następujących rekurencyjnych wywołań dla wejścia [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]]]) 

Włączone ostatnie wywołanie, arr jest null (jest to podstawowy przypadek), więc po prostu zwraca acc, ch ma wartość [3, [2, [1, null]]].

Warto wspomnieć, że ta zagnieżdżona struktura tablicowa to w zasadzie cons list, która jest szeroko stosowana w programowaniu funkcjonalnym i bardzo sprzyja rekursywnym operacjom.

Wreszcie, oto iteracyjny wersja:

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