首页 > 解决方案 > 序言中的帕斯卡三角形,带有递归且没有切割

问题描述

我正在尝试在序言中编写一个返回帕斯卡三角形列表的程序。该列表包含用户输入指示的行的所有元素。例如:

ptriangle(3,X).

返回: 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), !.

但我试图找到一种方法来做到这一点,而无需!递归。你有什么建议吗?

标签: prologpascals-triangle

解决方案


您已经在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].

推荐阅读