пролог паскаль треугольник - PullRequest
1 голос
/ 16 ноября 2009

привет, кто-нибудь знает, как я могу сделать паскаль когда я прошу :? паскаль (2, строка). я получаю Row = [1,2,1] ??

пожалуйста, помогите мне

Ответы [ 3 ]

1 голос
/ 17 ноября 2009

Этот ответ на код гольфа имеет реализацию в прологе, просто разверните названия:

1 голос
/ 16 ноября 2009

Вот код для вычисления n-й строки.

Первая часть сканирует строку, чтобы вычислить следующую строку. Первая строка должна иметь префикс 0, чтобы первая «1» в следующей строке была суммой, как и другие элементы. Это повторяется в 2 списках:

pascal_next_row([X],[X]).
pascal_next_row([H,H2|T],[A|B]):-
    pascal_next_row([H2|T],B),
    A is H + H2.

Вторая часть вычисляет все строки до той, которая была задана. Это рекурсивно на N:

pascal(0, [1]) :- !.
pascal(N, R) :-
    N1 is N-1,
    pascal(N1, R1),
    pascal_next_row([0|R1], R).

Если вам нужен полный треугольник, все, что вам нужно сделать, это изменить второй параметр для обработки списка строк и собрать их:

pascal(0, [[1]]) :- !.
pascal(N, [R, R1 | RN]) :-
    N1 is N-1,
    pascal(N1, [R1 | RN]),
    pascal_next_row([0|R1], R).
0 голосов
/ 18 ноября 2009

Треугольник Паскаля также известен как треугольник Тарталья:

sumC([X,Y],[Z]) :- Z is X + Y.
sumC([X,Y|L], Z):- H is X + Y,
                    sumC([Y|L],L2),
                    Z = [H|L2].

tartaglia(1,[1]) :- ! .
tartaglia(2,[1,1]) :- !.
tartaglia(N, L) :- Ant is N - 1,
                   tartaglia(Ant,L2),
                   sumC(L2,R),
                   append([1|R],[1],L), !.

Используя предикат помощника sumC, вы можете легко получить его:

?- tartaglia(3,R).
R = [1, 2, 1].

?- tartaglia(2,R).
R = [1, 1].

?- tartaglia(1,R).
R = [1].

?- tartaglia(6,R).
R = [1, 5, 10, 10, 5, 1].

Как сказано в моем комментарии. Вы просите n-й ряд. [1,2,1] из вашего примера 3-я строка.

...