2017-09-27 1 views
-3

Je fais un exercice sur Erlang et je ne peux pas implémenter cette fonction.Erlang, fonction deep_reverse (Lst)

deep_reverse (Lst)

Inverse les éléments de L, à tous les niveaux. Par exemple, si Lst est [a, [b, c, [d]], e], le retour en arrière devrait renvoyer [e, [[d], c, b], a].

Quelqu'un peut-il m'aider avec cet exercice?

element_reverse(List) -> 
    Flat = lists:flatten(List), 
    lists:reverse(Flat). 
+0

ce que l'aide nécessaire? –

+0

Qu'est-ce que vous avez essayé jusqu'à maintenant? –

+0

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. –

Répondre

1

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

+0

Merci pour votre explication détaillée. Cependant, lorsque j'essaie d'exécuter la fonction avec List = [1, 2, [3, 4, [5, 6, 7], 8], 9], le résultat ne semble pas correct. Il devrait retourner [9, 8, [7, 6, [5, 4, 3], 2], 1] au lieu de [9, [8, [7,6,5], 4,3], 2,1 ] –

+0

Etes-vous sûr de ça? Cela ne semble pas juste. Dans votre solution '2' fait partie de la première liste interne, ce qui ne peut jamais être le cas, puisque dans l'exemple il fait partie de la liste la plus externe. La même chose vaut pour '8', qui fait partie de la liste extérieure, quand il devrait faire partie de la première liste intérieure. –

+0

Oups, c'est de ma faute. Tu as raison. Désolé pour ça! Mais pouvez-vous me montrer le moyen de modifier la fonction ci-dessus pour qu'elle puisse revenir [9, 8, [7, 6, [5, 4, 3], 2], 1]? –