J'essaie d'écrire un programme dans Scheme qui prend une liste et renvoie une liste des seuls éléments non numériques qu'il contient. Cela semble devoir fonctionner, mais cela n'imprime que la liste entière. Quelqu'un peut-il voir ce que je fais de mal ici?

;;;up-to-first-number
;;;takes a list as its input and returns a list containing all
;;;the elements up to the first numeric element in the input list.

;;test lists
(define mylist '(a b c 1 2 3))
(define mylist2 '(1 2 2 4 5))


    (define (up-to-first-number list)
      (cond
       ((null? list)'())  ;if list is null, return null list
       ((number? list) '())  ;if item is a number, return null list
       (else (cons (car list) (up-to-first-number (cdr list)))) )) ;else, add item to new list and recurse

Merci d'avance pour votre aide!

1
Ang 4 avril 2017 à 05:38

2 réponses

Meilleure réponse

Votre deuxième condition est fausse:

((number? list) '())

Vous ne testez pas la liste avec number?, vous devez tester (car list), et traiter récursivement (cdr list) si l'élément head est un nombre. Consultez le code suivant:

(define (up-to-first-number lst)
(cond
 ((null? lst) '())
 ((number? (car lst)) (up-to-first-number (cdr lst)))
 (else (cons (car lst) (up-to-first-number (cdr lst))))))
2
shizhz 4 avril 2017 à 12:06

Avec une procédure aussi simple, vous devriez pouvoir déduire manuellement.

(up-to-first-number '(1)) ; ==

(cond
  ((null? '(1)) '())
  ((number? '(1)) '())
  (else (cons (car '(1)) (up-to-first-number (cdr '(1))))))

Donc (null? '(1)) est #f comme prévu, mais vous pourriez être surpris (number? '(1)) est #f aussi? Peut-être que votre bug est là quelque part.

Notez également qu'en appelant votre argument list la procédure standard list n'est plus disponible dans cette procédure. C'est pourquoi vous voyez souvent lst être utilisé pour désigner l'argument de liste dans le code de schéma.

0
Sylwester 4 avril 2017 à 07:57