Created
March 30, 2015 19:25
-
-
Save fabian57/211ca0d99b32e78953ee to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| def suffix_sequences(suffix, seq): | |
| result = [] | |
| for l in seq: | |
| result.append(l+[suffix]) | |
| return result | |
| from math import log | |
| def power_list(seq, result=[[]]): | |
| if 2**len(seq) == len(result): | |
| return result | |
| else: | |
| result += suffix_sequences(seq[int(log(len(result), 2))], result) | |
| return power_list(seq) |
Voici ma correction officielle (non terminale):
def power_list(sequence):
if sequence == []:
return [[]]
parts = power_list(sequence[:-1])
return parts + suffix_sequences(sequence[-1], parts)
C'est encore un recyclage de mon cours de programmation fonctionnelle. Pour ta culture, voici la version OCaml (l'ordre est changé pour être plus proche de l'ordre naturel des listes chaînées d'OCaml):
let prefix_lists x ll = List.map (fun l-> x::l) ll;;
let rec parts = function
| [] -> [[]]
| x::l -> let lpl = parts l in lpl @ prefix_lists x lpl;;
Pour comprendre ça, tu as besoin de savoir que:
f a b cveut dire: fonctionfappliquée aux argumentsa,betc(notéf(a,b,c)dans la plupart des langages);List.map f [a1; a2; ...; an]calcule [f a1; f a2; ...; f an];fun l -> x::lse lit: la fonction (anonyme) qui prend une listelet renvoiex::l;::est le constructeur des listes, par exemple 1::[2; 3] construit la liste [1; 2; 3];- Le pipe
|permet de faire un filtrage (pattern matching), un peu comme une série de tests, sauf que l'on teste non pas exactement la valeur, mais sa forme. Ça se lit:partsest une fonction qui, quand on lui envoie une liste vide, renvoie une liste réduite à la liste vide; et quand on lui envoie une liste de têtexet de queuel, renvoie tout le truc de droite; @désigne la concaténation de listes.
Ouf!
Et pour finir les deux fonctions en une seule ligne:
def power_list(l, r = [[]]):
return power_list(l[1:], r + [s + [l[0]] for s in r]) if l else r
C'est tout de suite plus clair ;)
Author
Merci pour la version non terminale, j'ai pas réussi à la faire, surtout après avoir utiliser un "for" dans une version récursive
Et les programmes d'une ligne je trouve ça toujours impressionnant
PS: arrêtez de me faire des compliments je vais croire que je suis trop bon
Si tu n'es pas bon, en tout cas tu travailles et c'est le meilleur moyen de le devenir ;)
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Oui, j'y arrive en m'inspirant de ce que tu as fait:
Joli. Je n'y avais pas pensé du tout. Bravo à toi!