2015-10-22 4 views
-1

Comment créer une fonction countSymbols qui prend en entrée une liste imbriquée de nombres et de symboles et renvoie le nombre de tous les symboles de la liste d'entrée.Nombre de symboles dans une liste

(countSymbols '(a)) returns 1 
(countSymbols '(2 56 x (1 y))) returns 2 
(countSymbols '(((a)) -2 (2 (ab b) (-1 0 1))))) returns 3 

ce que j'ai essayé

(define (countSymbols mylist) 
    (if (null? mylist) 0 
    (let ((c (car mylist))) 
    (cond 
     ((list? c) (+ (countSymbols c) (countSymbols (cdr mylist)))) 
     ((symbol? c) (+ 1 (countSymbols (cdr mylist)))) 
     (else (countSymbols (cdr mylist))))))) 
+1

Qu'est-ce que vous avez essayé jusque là? afficher le code que vous avez écrit, en pointant les parties spécifiques qui vous causent des problèmes. –

Répondre

1

Ce problème peut être résolu en utilisant le modèle standard pour parcourir une liste de listes, que vous devriez déjà avoir étudié en classe. Je ne vais pas gâcher le plaisir d'écrire votre propre solution, mais je vais vous donner quelques conseils - remplir les blancs:

(define (countSymbols lst) 
    (cond ((null? lst) <???>) ; how many symbols in an empty list? 
     ((not (pair? lst)) ; if this is a single elment of the list 
     (if (symbol? lst) ; check if it's a symbol, if so 
      <???>   ; then we add one to the count 
      <???>))  ; otherwise we add nothing 
     (else    ; else we advance the recursion and add the 
     (+ (countSymbols <???>)  ; result of both the `car` part 
      (countSymbols <???>))))) ; and the `cdr` part of the list 

Il fonctionne comme prévu:

(countSymbols '(a)) 
=> 1 
(countSymbols '(2 56 x (1 y))) 
=> 2 
(countSymbols '(((a)) -2 (2 (ab b) (-1 0 1)))) 
=> 3 
+0

ce que j'ai essayé (define (countSymbols myList) (if (null? Mylist) 0 (LET ((c (voiture myList))) (cond ((liste? C) (+ (countSymbols c) (countSymbols (cdr mylist)))) ((symbole? c) (+ 1 (countSymbols (cdr mylist)))) (else (countSymbols (cdr mylist))))))) – TheAmateur