2017-10-11 10 views
0

récemment, j'apprends SICP mais je répondre à une question étrange:au sujet reste de la raquette devrait params

Error: 
remainder: contract violation 
    expected: integer? 
    given: '(3 4 5 6) 
    argument position: 1st 
    other arguments...: 
    2 

voici mon code

(define (same-parity sample . other) 
     (if (null? other) 
      (cons sample '()) 
      (if (= (remainder sample 2) (remainder (car other) 2)) 
        (cons (car other) (same-parity sample (cdr other))) 
        (same-parity sample (cdr other))))) 

    (same-parity 1 2 3 4 5 6) 
  1. os: win10
  2. lang: raquette v6.10.1

Il dit reste attendu un entier param Je pense que j'ai donné un nombre entier pour rester pas une liste. Alors quelqu'un peut-il dire à mon problème quel est le problème avec mon code. Je suis dans un grand dilemme. Merci d'avance.

Répondre

0

Cette erreur se produit car votre procédure fonctionne sur un nombre inconnu d'arguments multiples - c'est ce que le . signifie lors de la déclaration de la procédure, et other est interprété comme une liste d'arguments. Il passe les bons arguments lorsque la procédure est appelée, mais la première fois que nous appelons la récursivité, elle échoue.

Une solution consiste à s'assurer que nous appliquons toujours la procédure sur plusieurs arguments, au lieu de passer une liste comme deuxième argument, ce qui est ce que votre code fait maintenant, provoquant l'erreur. Essayez ceci:

(define (same-parity sample . other) 
    (if (null? other) 
     (cons sample '()) 
     (if (= (remainder sample 2) (remainder (car other) 2)) 
      (cons (car other) (apply same-parity sample (cdr other))) 
      (apply same-parity sample (cdr other))))) 
+0

merci de résoudre parfaitement mon problème – Ceuvres