2010-10-23 4 views
1

je dois faire une fonction avec la signature diffFolge :: (Integer, Integer) -> [Integer], qui, lorsqu'il est appliqué à la paire d'arguments (m, n) (m, n> 0) retourne une liste descendante des numéros, la différence entre le nombre beeing n. Le premier élément de la liste de résultats est m, le dernier élément est toujours supérieur à 0 et le dernier élément soit 0 soit une valeur strictement inférieure à 0.différence sous-produit

Je l'écris comme suit:

diffFolge :: (Integer,Integer) -> [Integer] 
diffFolge (m,n) = if m > 0 && n > 0 then [m,m-n..n-2*n] else [] 

exemple

input : diffFolge (5,1) 
output : [5,4,3,2,1,0] 

exemple

input : diffFolge (5,2) 
output :[5,3,1,-1] ---> This is true by my code 

Cependant, avec l'entrée donnée dans le premier exemple ma fonction retourne [5,4,3,2,1,0,-1]. Comment puis-je corriger cela?

Répondre

0

Je ne sais pas, je comprends ce que vous voulez, mais je devine que voici:

diffFolge (m,n) | m <= 0 = [m] 
       | otherwise = m : diffFolge (m-n,n) 

L'erreur dans votre code est vraiment le dernier élément de votre séquence, n - 2*n, notez , de sorte que votre liste ne s'arrête pas jusqu'à ce que vous obtenez un élément qui est strictement inférieur à -n, mais dans le cas où votre liste comprend 0, l'avant-dernier élément est 0 et le dernier élément est -n. Pour résoudre ce problème, vous pouvez simplement ajouter 1 à celui-ci: [m,m-n..1-n]. Ensuite, si la liste contient 0, -n est exclue, et si elle ne contient pas 0, le dernier élément est compris entre 0 et 1-n.

+0

c'était la réponse ce que je cherchais merci ... – marco

5

La syntaxe [a..b] de Haskell renvoie une liste incluantb si possible.

Vous pouvez utiliser [m, m-n .. 1-n], de sorte que -n est exclue.

(BTW, n-2*n == -n)

+0

cela est vrai, mais par exemple quand je donne ce comme exemple diffFolge (5,2) muss de sortie donc [5,3,1, -1] – marco

+0

@ifan: Voir mise à jour. – kennytm

1

Pour moi, il arrive aussi que vous avez prétendiez m> = n est donc ici une idée rapide:

diffFolge :: (Integer, Integer) -> [Integer] 
diffFolge (m,n) 
    | m <= 0 || n <= 0 = [] 
    | n > m = diffFolge (n,m) -- | Only if you want this case 
    | otherwise = takeWhile (>= 0) $ iterate (\x->x-n) m 
+0

merci pour ce – marco

2

Parfois, il est utile de faire un peu de mathématiques. :)

diffFolge (m, n) = [m, m-n .. 1-n] 

De même, il est inhabituel d'utiliser un tuple pour plusieurs arguments d'une fonction dans Haskell. Je serais plus susceptibles d'écrire

df m n = [m, m-n .. 1-n] 

Et puis, si pour une raison quelconque, je vraiment besoin d'une fonction qui prend un tuple, je voudrais écrire:

diffFolge = uncurry df 
+0

Ah, j'ai raté la réponse de KennyTM qui l'a déjà fait remarquer. – Yitz