2013-06-23 3 views
2

Je viens de commencer à apprendre Scheme aujourd'hui. J'ai écrit une fonction gcd(), mais elle renvoie toujours 0.Scheme - mon gcd() renvoie toujours zéro

(define (gcd a b) 
    (cond (= b 0) 
     (a) 
    (else ((gcd b (modulo a b)))) 
    ) 
) 

Pourquoi je me trompe?

+0

Problèmes de parenthèses. Utilisez un bon IDE et indentez correctement pour éviter ce genre de problème, pour l'instant regardez ma réponse pour voir ce qui s'est mal passé. –

+0

Il est à noter que votre gcd ne fonctionne que si a = b. – carla

Répondre

8

Cela devrait résoudre les problèmes:

(define (gcd a b) 
    (cond [(= b 0) a] 
     [else (gcd b (modulo a b))])) 

Vous encerclaient à tort certaines expressions entre parenthèses, et quelques parenthèses étaient absents de l'expression cond.

Notez que dans le schéma, lorsque vous entourez quelque chose entre parenthèses, dire (a) vous dire l'interprète: a est une procédure sans argument et je veux l'appeler, et cela n'a pas été le cas ici, est a juste un nombre.

En outre, pour des raisons de lisibilité, il est une bonne idée d'utiliser [] au lieu de () pour séparer chacune des conditions dans une expression cond, comme indiqué dans mon code ci-dessus - mais ne pas les oublier, ils sont obligatoires et dans votre code, vous les avez oubliés dans la première condition.

3

D'autres personnes ont décrit votre erreur et ce que vous devriez faire.

Il est également instructif de considérer comment votre code est réellement exécuté et pourquoi il produit la sortie que vous voyez. En raison de vos parenthèses manquantes, le premier cas pour votre cond est (= b 0). La première chose (=) est prise comme condition. Tout dans le schéma sauf #f est vrai, donc c'est toujours vrai. Comme c'est vrai, ce cas est évalué. Plus précisément, le reste des choses entre parenthèses est considéré comme des expressions (possibles multiples) à évaluer, en tant que begin implicite. Donc, fondamentalement, il évalue (begin b 0). Le résultat est le résultat de la dernière expression, 0.

Questions connexes