2010-11-02 5 views
0

Je rencontre des difficultés pour ajouter une liste dans cette fonction de schéma.Problème avec le schéma de création d'une liste correcte

La fonction est censée prendre 2 arguments, et retourner une liste composée des 2èmes éléments le nombre de fois spécifié dans le 1er élément. Par exemple, si vous appelez (make-list? 5 4), votre sortie doit être (4 4 4 4 4).

Le problème est que lorsque j'utilise cons, j'obtiens ((((4 . 4) . 4) . 4) . 4) à la place. Si je comprends bien, j'ajoute à la fin de la liste entière comme un objet à chaque fois, pas le dernier élément comme je veux. Je ne suis pas sûr de la façon de le réparer.

Voici ma fonction, des suggestions sur la façon de parer au dernier élément au lieu de la liste en tant qu'objet seraient géniales. (Ou d'autres suggestions si ce n'est pas le seul/réel problème.)

;make-list 
(define make-list? 
    (lambda (N A) 
    (if (= N 1) 
     A 
     (cons (make-list?(- N 1) A) A) 
    ) 
) 
) 
+0

Un simple commentaire de style, mais la plupart du temps des fonctions qui se terminent par '?' sont des prédicats qui retournent true ou false. – samdphillips

Répondre

2

Une bonne règle de base est que chaque liste se termine par '(). Dans ce cas, il pourrait être plus illustrative pour rendre votre base de 0 et cas avoir retourner la liste vide:

(define make-list? 
    (lambda (n a) 
    (if (zero? n) 
     '() 
     (cons a (make-list (sub1 n) a))))) 

Ainsi, dans cet exemple, si nous avons atteint 0, puis on retourne la liste vide " cap sur "la liste que nous construisons.

+0

merci, ajouté cela à ma fonction. vous étiez bien sûr que je voulais des listes correctes. – cliff259

1

Votre problème est un problème ennuyeux, et est causée par la façon dont fonctionnent les cellules Cons. (contre un b) crée une contre-cellule si b n'est pas une liste. En réordonnant ainsi vous ajoutez l'atome à la liste, et non l'inverse, et faites en sorte que l'élément le plus interne soit une liste (d'ailleurs, vous pouvez utiliser (contre A '()) au lieu de (liste A) dans la définition suivante) vous contournez ceci.

(define make-list? 
    (lambda (N A) 
    (if (= N 1) 
     (list A) 
     (cons A (make-list?(- N 1) A)) 
    ) 
) 
) 
+0

Merci beaucoup. Il m'aurait fallu du temps pour réaliser cette propriété de contre. Bonne réponse qui a tout éclairci. – cliff259

Questions connexes