prolog - 序言中的帕斯卡三角形,带有递归且没有切割
问题描述
我正在尝试在序言中编写一个返回帕斯卡三角形列表的程序。该列表包含用户输入指示的行的所有元素。例如:
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), !.
但我试图找到一种方法来做到这一点,而无需!
递归。你有什么建议吗?
解决方案
您已经在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].
推荐阅读
- python - 大括号内的格式字符串替换为一个大括号
- swift - 如何将@AppStorage 用于字符串字典 [String: String]
- javascript - 我可以使用 CSS 或 JavaScript 在新的全尺寸窗口中打开缩略图吗?
- xamarin.android - 停止运行程序,因为 WebView
- flutter - tflite颤动中detectObjectOnImage和runModelonImage的区别
- flask - (Flask) WTForm 以错误的值呈现
- php - Symfony 5.1 - 无法自动装配服务
- node.js - 使用 Typescript 和 Node 在 CLI 中克隆 git 存储库
- javascript - 使用 Parcel Service Worker 缓存插件添加更多文件类型
- c# - 如何使用自己的令牌系统保护我的 ASP.NET API