Permutare una lista di numeri premendo e scoppiando in una pila

1

Supponiamo di avere una lunga pila di numeri. C'è un altro stack intermedio e uno stack di destinazione da restituire alla fine. Le sole due operazioni consentite sono il trasferimento della cima del vecchio stack all'elemento superiore dello stack intermedio e il trasferimento dell'elemento superiore dello stack intermedio nella parte superiore del nuovo stack. Elenca tutti i possibili nuovi stack che possono essere prodotti, supponendo che lo stack originale sia esaurito.

Uso Racket / Scheme. Le soluzioni puramente funzionali sono più preferibili;)

Qualche idea su come farlo? Con alcuni handwaving sembra che la funzione seguente preveda correttamente se una certa sequenza di output è possibile, dato che la sequenza di input è ordinata da piccola a grande:

(define (possible? lst)
  (match lst
    [(cons a b)
     (and (if (andmap (λ(x) (< x a)) b) (sorted? b) #t) (possible? b))]
    [x #t]))

quindi posso semplicemente generare tutte le permutazioni della lista di input e filtrare quelle impossibili.

Sembra che ci dovrebbe essere una soluzione più elegante, che preferibilmente utilizza ricorsione e programmazione funzionale invece di loop e mutazione annidate.

    
posta ithisa 09.04.2013 - 22:52
fonte

1 risposta

1

perché hai solo 2 operazioni sono permesse puoi definire la sequenza di operazioni come un sottoinsieme rigido di una selezione di n da 2n-1 che ha (2n-1)! / ((n-1)! n!) possibilità (considerando che la prima operazione sta premendo sull'intermedio)

questo (secondo wolfram alpha ) doesn salire come veloce! (la quantità totale di permutazioni)

questo mi dice che il tuo algoritmo non può creare tutte le permutazioni una volta che n diventa abbastanza grande

modifica: per generarli tutti puoi trovare tutte le stringhe [01]{n} dove ognuna in qualsiasi punto non può essere 1 quando c'è già una quantità uguale di 1 e 0

rec(i,n,inter,res)
    if i==n 
        print res
    rec(i+1,n,inter~i,res)
    if(inter.length>0)
        rec(i,n,inter[0..$-1],rec~inter[$])
    
risposta data 10.04.2013 - 01:06
fonte

Leggi altre domande sui tag