Sto cercando di codificare un Erlang Mastermind risolutore come esercizio (io sono un novizio completo, ma mi sa che è un esercizio interessante per un linguaggio funzionale)Potenza cartesiana di una lista in Erlang
lo voglio per essere il più generale possibile, quindi sento di aver bisogno di una funzione di alimentazione cartesiana. Qualcosa di simile:
cart_pow([a,b],2) -> [[a,a],[a,b],[b,a],[b,b]]
cart_pow([a,b],3) -> [[a,a,a],[a,a,b],[a,b,a],[a,b,b],[b,a,a],[b,a,b],[b,b,a],[b,b,b]]
Non riesco a pensare ad una soluzione puramente funzionale (ricorsiva, mappa, piega ...). Eventuali indizi? Bonus se è pigro.
mul era il pezzo che mancava. Non riuscivo a ottenere che restituisse la struttura corretta, principalmente perché II non capiva che l'input corretto non era ([a, b], [a, b]) ma ([[a], [b]] , [[a], [b]]) – faibistes
In funzione 'mul' ha calcolato il prodotto cartesiano di due liste. Si può notare che la sintassi di concatenazione degli elenchi utilizzata lì (operatore '++'). Quindi, significa che quella funzione funziona solo con elenchi di elenchi. Ecco perché devi chiamare 'mul ([[a], [b]], [[a], [b]])' invece di 'mul ([a, b], [a, b])'. Se guardi il punto di ingresso (funzione 'cart/2') - potresti notare che io ** trasformo la lista di input in lista di liste ** (avvolgendo ciascun elemento nel suo elenco:' [[X] || X <- List] ', quindi list '[a, b]' si trasforma in '[[a], [b]]'). – stemm
Sarebbe O (log (N)) se l'operatore '++' era O (1) ma sfortunatamente è O (N) (dove N è la lunghezza dell'argomento a sinistra) così efficacemente stai solo sostituendo più '[ |] 'con un singolo' ++ '. La tua soluzione funziona più velocemente (una differenza costante) rispetto alla prima versione della mia, ma sospetto che sia dovuto alla coda chiamata nel secondo caso.Per esempio se faccio la mia soluzione in modo ricorsivo (vedi il mio aggiornamento) diventa più veloce della tua (di nuovo, una differenza costante). –