una versione scritta con l'idea di un fold
Abbiamo bisogno di una funzione che chiameremo cons (questo deriva da lisp/schema ecc.). Prende un elemento e una lista e aggiunge quell'elemento alla testa (inizio) della lista. Si noti che in Python questo non è efficiente.
def cons(x,xs):
return [x] + xs
Ora la funzione piega (in senso stretto una piega a sinistra). Questa è una funzione a sé stante e può essere utilizzata per molte cose (vedi il link) l'equivalente python sarebbe probabilmente reduce
.Si noti che ci vuole una funzione f
e si applica questa funzione per la testa della lista e la variabile acc
(abbreviazione di accumulatore)
def foldl(f,acc,xs):
if not xs:
return acc
head, *tail = xs
return foldl(f, f(head,acc), tail)
Ora possiamo scrivere una versione di inversione che è ricorsiva (perché piega è ricorsiva)
def reverse(xs):
return foldl(cons, [], xs)
Quindi una piega racchiude l'idea di una funzione ricorsiva. Per esempio, se volessimo riassumere in modo ricorsivo una lista di numeri che potremmo definire come:
from operator import add # this is just '+' as a function
def sum(xs):
return foldl(add, 0, xs)
Se dovessimo definire un diritto piega, come segue:
def foldr(f,acc,xs):
if not xs:
return acc
head, *tail = xs
return f(head, foldr(f, acc, tail))
quindi chiamando il foldr(cons, [], xs)
tornerà una lista identica a quella iniziale.
Per comprendere le basi della ricorsione, [questo] (http://stackoverflow.com/q/30214531/1903116) potrebbe aiutarti. – thefourtheye
Non si dispone di ricorsione (non si chiama mai revlist in revlist) e si restituisce sempre un singolo elemento, come si prevede di ottenere un elenco inverso? Probabilmente dovresti studiare un po 'di più;) – LeartS
Sì, lo so che dovrei e anche questo non è completo, ma sono un po' bloccato :( –