2010-11-18 4 views
4

J'ai besoin d'une fonction LISP récursive qui énumère le nombre d'éléments dans une liste de nombres> 3. Je ne suis pas autorisé à utiliser lets, boucles ou Whiles et ne peut utiliser que CAR de base , CDR, SETQ, COND, CONS, AJOUT PROGN, LISTE ...récursion LISP de base, énumérer les valeurs supérieures à 3

C'est ma tentative de la fonction:

(defun foo (lst) 
    (COND ((null lst) lst) 
    (T (IF (> (CAR lst) 3) 
     (1+ (foo (CDR lst))) 
     (foo (CDR lst)))))) 

l'appel de fonction:

(foo '(0 1 2 3 4 5 6)) 

Répondre

5

Votre code est assez proche du correc t, juste une petite erreur dans le cas de base:

Pour la liste vide, vous renvoyez la liste vide. Donc, si vous avez la liste (6), vous ajoutez 6 à foo dans la liste vide, qui est la liste vide. Cela ne fonctionne pas car vous ne pouvez pas ajouter de numéro à une liste.

Vous pouvez facilement corriger en faisant foo retour 0 au lieu de lst quand lst est vide. Comme une note de style: Mélanger cond et if comme cela, semble un peu redondant. Je voudrais écrire comme ça, en utilisant seulement cond à la place:

(defun foo (lst) 
    (cond 
    ((null lst) 
     0) 
    ((> (car lst) 3) 
     (1+ (foo (cdr lst)))) 
    (T 
     (foo (cdr lst))))) 
+0

Je ne savais pas pu travailler cond cette façon. Toutes les ressources en ligne sont dispersées sur Internet et difficiles à comprendre ... – toast

+1

La meilleure ressource en ligne pour le lisp commun est (probablement) "The HyperSpec" (http://www.lispworks.com/documentation/HyperSpec/Front /) et est proche de la description la plus complète de CL. – Vatine

4

Quelques points stylistiques:

  • Il n'y a pas besoin de mettre un peu LISP ins en majuscules. Ce n'est plus 1958!
  • Mais si vous êtes va mettre les built-ins en majuscule, pourquoi pas DEFUN et NULL? Vous avez un if dans la dernière branche de votre cond. C'est redondant. Depuis le but de cond est des conditions de test, pourquoi ne pas l'utiliser?
  • Vous n'avez pas besoin d'espacer vos parenthèses de fermeture comme ça. Personne ne compte les parenthèses ces jours-ci, nous avons des éditeurs de parenthèses.
  • Lisp a des espaces de noms séparés pour les fonctions et les valeurs, ainsi vous n'avez pas besoin d'appeler votre argument lst pour éviter tout conflit avec la fonction intégrée list.

Si vous programmez cela pour de vrai, bien sûr, vous utiliseriez count-if:

(count-if #'(lambda (x) (> x 3)) '(0 1 2 3 4 5 6)) 
    ==> 3 
+1

Désolé pour les questions stylistiques (premier programme) ... peut-être que mon professeur a appris LISP en 1958 - j'ai ri quand même. Je crois que "count-if" est en dehors de la portée des fonctions que nous sommes autorisés à utiliser. – toast

Questions connexes