inverser liste - régime
Je suis en train d'inverser une liste, voici mon code:
(define (reverse list)
(if (null? list)
list
(list (reverse (cdr list)) (car list))))
donc, si je entrer (reverse '(1 2 3 4)), je veux qu'il à en sortir (4 3 2 1), mais pour l'instant il ne me fait pas ça. Ce que je fais mal et comment puis-je résoudre ce problème?
- Attendez-vous de votre code pour travailler avec l'un ou l'autre ou les deux de la circulaire de listes et de mauvaise listes?
Vous devez vous connecter pour publier un commentaire.
La façon naturelle de se reproduire sur une liste n'est pas la meilleure façon de résoudre ce problème. À l'aide de
append
, comme suggéré dans la accepté de répondre signalé par @lancery, n'est pas une bonne idée non plus - et de toute façon si vous êtes en train d'apprendre votre chemin dans le Schéma, il est préférable si vous essayez de mettre en œuvre la solution vous-même, je vais vous montrer comment le faire, mais d'abord un conseil: n'utilisez pas delist
comme un nom de paramètre, c'est une procédure interne et vous seriez de l'écraser. Utiliser un autre nom, dire,lst
.C'est plus simple pour inverser une liste par le biais d'une aide de la procédure, qui s'accumule à la suite de consing chaque élément à la tête du résultat, ce qui aura pour effet d'inverser la liste - par ailleurs, l'aide de la procédure est la queue-récursive. Voici l'idée générale, remplir les espaces vides:
Bien sûr, dans la vraie vie vous ne voudriez pas mettre en œuvre
reverse
à partir de zéro, il y a un haut- procédure pour que.Queue approche récursive à l'aide d'un nommé
let
:C'est fondamentalement la même approche que pour avoir une fonction d'assistance avec un accumulateur argument comme Oscar de la réponse, où la
loop
de liaison aprèslet
fait de le laisser dans une fonction intérieure que vous pouvez appeler.Ici est une procédure récursive qui décrit un processus itératif (queue récursive) de l'inversion d'une liste dans le Schéma
À l'aide de la substitution de modèle pour (reverse (list 1 2 3 4))
Ici est une procédure récursive qui décrit un processus récursif (pas de queue récursive) de l'inversion d'une liste dans le Schéma
À l'aide de la substitution de modèle pour (reverse2 (liste 1 2 3 4))
Voici une solution à l'aide de
build-list
procédure:Celui-ci fonctionne mais ce n'est pas une queue de procédure récursive:
Je pense qu'il serait préférable d'utiliser append au lieu de contre
ce une autre version avec de la queue de la récursivité
Une réponse de plus semblable à l'Oscar. J'ai juste commencé à apprendre le régime, donc excusez-moi en cas de problème :).
Il n'y a pas besoin de l'ajout ou le remplissage du corps avec un tas de lambdas.
append
au lieu decons
. L'exécution de(reverse '(1 2 3))
rendements'(((() . 3) . 2) . 1)