Tout d'abord, permet de regarder comment une simple fonction inverse pourrait ressembler, sans la fonction profonde.
Une fonction avec 1 paramètre n'est pas suffisante, nous avons besoin d'un accumulateur, une valeur qui est reportée à l'étape récursive suivante. L'accumulateur est une liste vide au début et à chaque étape de la récursion, il sera rempli successivement.
simple_reverse(List) -> simple_reverse(List, []).
Donc, maintenant nous devons définir une fonction à 2 paramètres de telle sorte que simple_reverse(List, [])
peut être appelé.
simple_reverse([H|T], Accu) ->
simple_reverse(T, [H] ++ Accu);
simple_reverse([], Accu) -> Accu.
La première partie de la définition de fonction gère les listes avec du contenu. [H|T]
signifie, nous avons une liste et H
(Head) est le premier élément de celui-ci, tandis que T
(Tail) est le reste de la liste. Nous appelons à nouveau simple_reverse
avec la queue comme premier paramètre, et accumulons la valeur de la tête avec la tête de l'accumulateur en premier.
La deuxième partie traite du cas où la liste est vide. Quand cela arrive, nous pouvons renvoyer l'accumulateur (toutes les valeurs qui ont été accumulées tête en premier).
Lorsque vous comprenez ce qui se passe ici, la mise en œuvre d'un deep_reverse
est relativement simple. Si vous ne comprenez pas ce qui se passe ici, vous devriez lire un peu à propos de lists et recursion. Nous examinons ici la valeur H
. H
peut être soit une liste elle-même ([_|_]
) ou autre chose (_
). La récursivité est essentiellement la même que simple_reverse
, sauf lorsque H
est une liste. S'il s'agit d'une liste, nous devons appeler à nouveau deep_reverse
sur H
lorsque la récursion est en cours d'exécution.
Voici quelques liens si vous avez du mal à comprendre la syntaxe: case-expressions et pattern-matching
ce que l'aide nécessaire? –
Qu'est-ce que vous avez essayé jusqu'à maintenant? –
Je suis l'idée. D'abord, j'extrais tous les éléments dans la liste en utilisant la fonction aplatie. Ensuite, j'utilise la fonction reverse pour créer une liste inversée. Ma difficulté actuelle est que je ne peux pas remplacer les éléments dans la liste inversée par des éléments dans la liste d'entrée. –