Liste de longueur dans le schéma
Salut, je suis en train d'écrire un programme où une liste de listes de vérification pour voir si ils sont égaux en taille et en retour #t si elles le sont.
Donc par exemple si je devais écrire (liste-contre? '((1 2 3) (4 5 6) (7 8 9))) le programme serait de retour #t, et (liste-contre? '((1 2 3) (4 5 6) (7 8))) serait de retour #f.
Jusqu'à présent c'est ce que j'ai fait:
(define list-counter?
(lambda (x)
(if (list? x)
(if (list?(car x))
(let (l (length (car x))))
(if (equal? l (length(car x))))
(list-counter?(cdr x))
) ) ) ) )
Je pense que lorsque je vais mal, c'est après que j'ai mis de la longueur de l à la longueur de la première liste. Toute aide serait appréciée.
OriginalL'auteur gestalt | 2012-03-22
Vous devez vous connecter pour publier un commentaire.
Il y a plusieurs façons de résoudre ce problème. Par exemple, par la main et aller étape par étape:
Laissez-moi vous expliquer les procédures ci-dessus. Je suis diviser le problème en deux étapes, d'abord en créer une nouvelle liste avec les longueurs de chaque sous-liste - c'est ce que
all-lengths
. Ensuite, comparer le premier élément dans une liste avec le reste des éléments, et de voir si ils sont tous égaux - c'est ce queall-equal?
. Enfin,list-counter?
il encapsule tous ensemble, appelant les deux procédures précédentes avec les bons paramètres.Ou encore plus simple (et plus court), en utilisant la liste des procédures (de l'ordre supérieur des procédures):
Pour la compréhension de la deuxième solution, d'observer que
all-lengths
etall-equal?
représentent des cas particuliers de plus de procédures générales. Lorsque nous avons besoin de créer une nouvelle liste avec le résultat de l'application d'une procédure pour chacun des éléments d'une autre liste, nous utilisonsmap
. Et quand nous avons besoin d'appliquer une procédure (=
dans ce cas) pour tous les éléments d'une liste en même temps, nous utilisonsapply
. Et c'est exactement ce que la deuxième version delist-counter?
est en train de faire.Oui, vous auriez besoin d'un supplément de cas - en fait, les deux solutions supposer que la liste des listes a au moins un élément.
... Et la deuxième solution s'attend au moins deux éléments
López: pas tellement.
Ou au moins, pas de façon constante à travers les implémentations.
OriginalL'auteur Óscar López
Vous pourriez écrire une
all-equal?
fonction de la façon:alors:
Sinon, vous pouvez faire:
Ce qui c'est dit: si la liste est de longueur 0, notre déclaration est vacuously vrai, sinon on capture le premier élément de la liste de la longueur (dans le 'else' une partie de la
if
-clause), le mettre dans la fermeture définies parlet
's de sucre syntaxique (en fait, lambda), et qui permet de définir unlength-equal-to-first?
fonction.Malheureusement
reduce
n'est pas paresseux. Ce que nous aimerions bien est pour éviter le calcul des longueurs des listes si nous constatons que seulement l'un n'est pas égal. Donc pour être plus efficace, nous avons pu faire:Noter que
all-match?
est déjà défini pour vous avec le MIT du régime(list-search-positive list pred)
ou(for-all? list pred)
, ou dans la Raquette commeandmap
.Pourquoi est-il si long à écrire?
Vous êtes obligé d'écrire un scénario de base parce que votre réduction n'a pas d'élément canonique puisqu'il repose sur le premier élément, et la liste de manipulation dans la plupart des langues n'est pas très puissant. Vous serais même d'avoir le même problème dans d'autres langages comme Python. Dans le cas où cette aide:
deuxième méthode:
Cependant la première méthode est beaucoup plus simple d'écrire dans n'importe quelle langue, car elle longe cette question en ignorant la base de cas.
première méthode:
Je l'ai réécrit beaucoup et corrigé quelques erreurs, il sera beaucoup plus propre.
Génial merci pour l'aide
Merci pour m'apprendre la différence entre
fold
etreduce
(le dernier de ne pas vous forcer à utiliser une graine initiale, généralement une mauvaise chose).OriginalL'auteur ninjagecko
Cela peut sembler un peu étrange, mais je pense que c'est facile.
Exécuter en bas de la liste, la construction d'une nouvelle liste contenant la longueur de chaque (contenu) de la liste, c'est à dire la carte de la longueur.
Descente de la construit la liste de longueurs, en comparant la tête pour le reste, retour #t si elles sont tout de même que la tête. Return false dès qu'il ne parvient pas à égaler la tête.
OriginalL'auteur gbulmer