序言中的帕斯卡三角形,递归且无切割
Pascal's triangle in prolog with recursion and without cuts
我正在尝试在 prolog 中编写一个程序,其中 returns 是 Pascal 三角形的列表。该列表包含用户输入指示的行的所有元素。
例如:
ptriangle(3,X).
returns:
X = [1, 2, 1]
到目前为止我有:
sumC([X,Y],[Z]) :- Z is X + Y.
sumC([X,Y|L], Z):- H is X + Y,
sumC([Y|L],L2),
Z = [H|L2].
ptriangle(1,[1]) :- ! .
ptriangle(2,[1,1]) :- !.
ptriangle(N, L) :- Ant is N - 1,
ptriangle(Ant,L2),
sumC(L2,R),
append([1|R],[1],L), !.
但我正在尝试找到一种无需 !
且使用递归的方法。你有什么建议吗?
您已经在 ptriangle
中使用递归。你可以避免削减 !
,代价是一些不确定性。
看看这个,看看变化:
sumC([X,Y],[Z, 1]) :- Z is X + Y.
sumC([X,Y|L], Z):- H is X + Y,
sumC([Y|L],L2),
Z = [H|L2].
ptriangle(1,[1]).
ptriangle(2,[1,1]).
ptriangle(N, [1|R]) :- N > 2,
Ant is N - 1,
ptriangle(Ant,L2),
sumC(L2,R).
最后那个append
可能会很贵,所以你可以让sumC
自己在建表的时候给一个
尝试找出更改如何影响执行。
PS:
sumC([X,Y|L], [H|L2]):- H is X + Y,
sumC([Y|L],L2).
是一种惯用的写法:
sumC([X,Y|L], Z):- H is X + Y,
sumC([Y|L],L2),
Z = [H|L2].
我正在尝试在 prolog 中编写一个程序,其中 returns 是 Pascal 三角形的列表。该列表包含用户输入指示的行的所有元素。 例如:
ptriangle(3,X).
returns:
X = [1, 2, 1]
到目前为止我有:
sumC([X,Y],[Z]) :- Z is X + Y.
sumC([X,Y|L], Z):- H is X + Y,
sumC([Y|L],L2),
Z = [H|L2].
ptriangle(1,[1]) :- ! .
ptriangle(2,[1,1]) :- !.
ptriangle(N, L) :- Ant is N - 1,
ptriangle(Ant,L2),
sumC(L2,R),
append([1|R],[1],L), !.
但我正在尝试找到一种无需 !
且使用递归的方法。你有什么建议吗?
您已经在 ptriangle
中使用递归。你可以避免削减 !
,代价是一些不确定性。
看看这个,看看变化:
sumC([X,Y],[Z, 1]) :- Z is X + Y.
sumC([X,Y|L], Z):- H is X + Y,
sumC([Y|L],L2),
Z = [H|L2].
ptriangle(1,[1]).
ptriangle(2,[1,1]).
ptriangle(N, [1|R]) :- N > 2,
Ant is N - 1,
ptriangle(Ant,L2),
sumC(L2,R).
最后那个append
可能会很贵,所以你可以让sumC
自己在建表的时候给一个
尝试找出更改如何影响执行。
PS:
sumC([X,Y|L], [H|L2]):- H is X + Y,
sumC([Y|L],L2).
是一种惯用的写法:
sumC([X,Y|L], Z):- H is X + Y,
sumC([Y|L],L2),
Z = [H|L2].