2012-09-13 1 views
1

Hey donc je crée une fonction (divise n), qui est censée calculer le nombre de diviseurs dans un nombre n à l'aide d'une fonction modulo et une fonction qui agit comme un compteur descendant du nombre n. Mon problème est que la fonction modulo doit générer un vrai ou faux, selon que le nombre est entier mais mon instruction ifRécursion du nombre parfait dans SCHEME. (débutant)

(if (= (divides n k) #f) 
    0 

Im ne sais pas pourquoi, mais le code d'évaluer l'habitude de l'instruction if comme vrai ou faux .. il juste le saute. Aussi je ne suis pas sûr que 0 devrait être la bonne sortie que je veux juste sauter ce numéro et ne pas le compter.

Heres mon code:

(define (divides a b) (= 0 (modulo b a))) 
(define (divisors-upto n k) 
    (if (= (divides n k) #f) 
     0 
     (+ k (divisors-upto n (- k 1))))) 
(define (divisors n) (divisors-upto n n)) 

(divisors 4) ;for example should produce the result 3 

Répondre

2

Commencez par fixer la procédure divides, vous a inversé les arguments à modulo. Voici comment il devrait ressembler:

(define (divides a b) 
    (= 0 (modulo a b))) 

Les tests ci-dessus si b divise a, voilà comment vous l'utilisez dans la procédure divisors-upto. Aussi, vous devez remplacer:

(= (divides n k) #f) 

Avec ceci:

(equal? (divides n k) #f) 

Ou encore mieux, ceci:

(not (divides n k)) 

En dehors de cela, est-ce pas la même question que vous posted avant? Je vous ai dit que vous manquez un cas dans la récursivité, regardez ma réponse précédente dans le lien. Si ce n'est pas la même procédure, alors je ne suis pas vraiment sûr de ce que vous voulez faire: dans cette question, vous indiquez que la procédure "est censée calculer le nombre de diviseurs dans un nombre", mais ce n'est pas ce que la procédure est en train de faire - vous ajoutez les diviseurs réels (le paramètre k dans la procédure) et non le nombre de diviseurs. Et encore, vous auriez manqué un cas - que se passe-t-il si le k actuel n'est pas un diviseur? la récursivité sortirait prématurément! Essayez de travailler sur ce un peu, remplir les espaces vides:

(define (divisors-upto n k) 
    (cond ((zero? k) 
     <???>) ; how many divisors are there if k is zero? 
     ((not (divides n k)) 
     <???>) ; if k is not a divisor of n, we must proceed without incrementing 
     (else ; if k is a divisor of n, by how many should the count be incremented? 
     (+ <???> (divisors-upto n (- k 1)))))) 
+0

oui ive travaille sur cette fonction de deux façons grâce à l'aide mal pour cette solution –

+0

je ne l'ai jamais pensé de cette façon , mais maintenant je vois que vous pouvez définir 'non' simplement comme' (cut eq? #f <>) '. L'idée de comparaison booléenne, en général, est si offensante pour moi que toute l'idée a été tirée de ma tête. :-) –

+0

@Roark Super! et n'oubliez pas d'accepter la réponse qui vous a été la plus utile dans cette question et dans vos autres questions - cliquez simplement sur la coche à gauche. –