Erlang - Проблемы с иерархией списков / кортежей после рекурсии - PullRequest
2 голосов
/ 31 октября 2011

Результирующее дерево этой рекурсии - это не то, что я, что, вероятно, доказывает, что я не до конца понимаю поведение списков / кортежей в рекурсии.Если бы кто-то мог объяснить, что я сделал неправильно в этом примере, а также объяснить, как правильно думать, я был бы очень благодарен.

move([],{Main, One, Two}) ->
    {Main, One, Two};
move([X|Xr], {Main, One, Two}) ->
    [{Main, One, Two}, move(Xr, single(X, {Main, One, Two}))].

Желаемый результат (один список, содержащий 3 кортежа):

[{[a,b],[],[]}, {[a],[b],[]}, {[],[b],[a]}, {[b],[],[a]}]

Фактический результат (список, содержащий кортеж и список, содержащий кортеж и список ...):

[{[a,b],[],[]},[{[a],[b],[]},[{[],[b],[a]},[{[b],[],[a]}]]]]

Ответы [ 2 ]

6 голосов
/ 31 октября 2011

У вас есть две проблемы:

  1. | вместо ,, как упоминалось @nmichaels.
  2. Функция move/2 возвращает список , поэтому завершающее предложение также должно возвращать список. Это не видно в вашем примере, поскольку первая проблема скрывает это.

Таким образом, результирующий код будет:

move([X|Xr], {Main, One, Two}) ->
    [{Main, One, Two} | move(Xr, single(X, {Main, One, Two}))];
move([], {Main, One, Two}) ->
    [{Main, One, Two}].

Я изменил порядок пунктов, поскольку лично я предпочитаю писать их таким образом. Нет принципиальной разницы в этом случае. Я предполагаю, что single/2 возвращает кортеж.

На самом деле вы можете оптимизировать этот код, удалив все знания о кортеже из move/2, так как он никогда не использует внутреннюю структуру. Итак:

move([X|Xr], Tuple) ->
    [Tuple | move(Xr, single(X, Tuple))];
move([], Tuple) ->
    [Tuple].
0 голосов
/ 31 октября 2011

Вы хотите использовать | вместо , при составлении списка:

move([X|Xr], {Main, One, Two}) ->
    [{Main, One, Two} | move(Xr, single(X, {Main, One, Two}))].

Рекурсивный вызов возвращает список, который будет вкладываться все глубже и глубже, если вы не используете |, чтобы немного их сгладить. Это та же концепция, что и при сопоставлении с шаблоном [X|Xr], только с обращенной операцией.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...