Пифагоровы тройки — это наборы целых чисел {A,B,C}, такие что A**2 + B**2 = C**2.

-module(pythagorean_triplets).
-compile(export_all).
pythagorean(N) ->
[{S1, S2, S3} || 
            S1 <- lists:seq(1, N),  %........1
            S2 <- lists:seq(1, N),  %........2
            S3 <- lists:seq(1, N),  %.........3
            (S1 + S2 + S3) =< N,    %..........4
             S1 =< S2,              %..........5
           S1 * S1 + S2 * S2 =:= S3 * S3]. %........6
test() ->
       io:format("Pythagorean triplets where sum of sides is less than or equal to 20 are ~n~p~n", [pythagorean(20)]),
io:format("Pythagorean triplets where sum of sides is less than or equal to 30 are ~n~p~n", [pythagorean(30)]),
ok.

Функция pythagorean() возвращает список сторон, сумма которых меньше или равна N и образует прямоугольный треугольник. Function демонстрирует простоту использования и компактность кода при использовании списков

Используя понимание списка, получите список сторон S1, S2, S3, таких что

#1 .S1 находится между 1 и N

#2.S2 находится между 1 и N

#3.S3 находится между 1 и N

№ 4. Сумма всех трех сторон меньше или равна N

#5. S1 меньше или равен S2 (чтобы удалить дубликаты)

№ 6. S1, S2, S3 — возможные стороны прямоугольного треугольника.

Функция test() с N=20 и 30

-module(permutations).
-compile(export_all).
permutations([]) ->[[]];
permutations(L1) ->
Permutations =
          fun(Start, Rest) ->
           Perm_Rest = permutations(Rest),  
          lists:map(fun(X) -> [Start | X] end, Perm_Rest)
          end,
[ X2  || X1 <- L1, X2 <- Permutations(X1, L1--[X1])].
test() ->
     io:format("All permutations of '1234' are ~p~n",[permutations("1234")]),
ok.

Функция Permutations() должна возвращать список списков. В случае, если L1 пуст, единственной возможной перестановкой является пустой список. Итак, мы возвращаем список, содержащий пустой список

Делим L1 на две части голова и хвост [Head1 | Tail1 ] = L1, все перестановки L1, которые начинаются с Head1, могут быть получены с помощью

списки: карта (веселье (X) -> [Head1 | X] конец, перестановки (Tail1))

Теперь, если мы можем каждый раз получать разные элементы списка вместо Head1, тогда мы можем получить все возможные перестановки, которые начинаются с этого элемента. Объединенный список всех таких перестановок даст все возможные перестановки L1.

Определение Permutations как функции, которая принимает Start и Rest и возвращает все перестановки [Start | Rest], которые начинаются с Start. Таким образом, если бы мы могли каждый раз поворачивать Start, чтобы он был другим элементом, тогда мы получили бы перестановки, которые начинаются с этого конкретного элемента.

Перестановки принимают два параметра

Start -> Символ или атом или элемент, который будет запускать каждую перестановку, сгенерированную этой функцией

Rest -> Список, для которого будут сгенерированы все возможные перестановки, а затем все эти комбинации будут иметь префикс Start

Получить все возможные перестановки Rest %…….Perm_Rest = permutations(Rest),

Префикс всех возможных перестановок Rest с Start

Для каждого X1, принадлежащего L1. Вычислите перестановки, которые начинаются с X1 и имеют перестановки L1 — [X1] после X1, а затем получите список всех таких перестановок (X2).

Мы также можем рекурсивно получать перестановки с помощью приведенной выше логики, объясненной следующим образом:

1. Перестановки пустого списка[] должны быть списком [[]], содержащим пустой список, поскольку перестановки — это списки списков. Например, перестановками «12» будут [«12», «21»], которые представляют собой список списков.

2. Чтобы найти все возможные перестановки строки (например, «abcd»), мы можем разделить задачу на более мелкие части. Сначала мы найдем все возможные перестановки «abcd», которые начинаются с «a», затем мы найдем все возможные перестановки «abcd», которые начинаются с «b», и так далее. Затем мы добавим эти четыре списка, чтобы получить все возможные перестановки «abcd».

Обратите внимание, что, если мы будем следовать этому подходу, мы не получим повторяющихся записей, поскольку ни один элемент не может входить в два списка списков, начинающихся с «a», или списков, начинающихся с «b» и т. д., поскольку списки не пересекаются.

Также обратите внимание, что мы не пропустим ни одной возможной перестановки «abcd», так как любая возможная перестановка «abcd» будет начинаться либо с «a», либо с «b», «c» или «d», и мы захватили все такие возможности.

3. Чтобы получить все возможные перестановки «abcd», которые начинаются с «a», мы можем найти все возможные перестановки «bcd» и добавить перед ними «a». Таким образом, мы получим все возможные перестановки «abcd», которые начинай с "а". Точно так же, чтобы получить все возможные перестановки, начинающиеся с «b», мы получим все возможные перестановки «acd» и добавим «b» ко всем из них.

4. Таким образом

перестановки («abcd») = prepend («a», перестановки («bcd»)) + .prepend («b», перестановки («acd»)) + prepend («c», перестановки («abd»)) + предварить («d», перестановки («abc»))

permutations("abcd") = lists:flatten(lists:map(fun(Element) -> prepend(Element, "abcd" — [Element]) end, "abcd"))

То же самое написано более простым способом ниже

перестановки2([]) -> [[]];

перестановки2(L1) -> [[H | Т] || H ‹- L1, T ‹- перестановки2(L1 — [H])].