prolog - 具有二项式系数的帕斯卡三角形

标签 prolog pascals-triangle

我必须编写一个谓词来计算一行帕斯卡三角形。我尝试用二项式系数来写这个。第一次,我设法通过使用 writeln() 显示每个结果来做到这一点。但我想将它们保存在我的列表 L 中。我该怎么做?谢谢

%coefficient(+N,+K,-R).
coefficient(_,0,1).
coefficient(N,N,1).
coefficient(N,K,R):-
    N>=K,
    K>0,
    N1 is N-1,
    K1 is K-1,
    coefficient(N1,K,R1),
    coefficient(N1,K1,R2),
    R is R1+R2.

/* Get a line from the coeff binomial */
%line(+E,-L)
line(N,L):-
    lineT(N,N,L).

lineT(_,0,_):-
    writeln(1).
lineT(N,K,L):-
    K > 0,
    K1 is K-1,
    coefficient(N,K,Zs),
    writeln(Zs),
    lineT(N,K1,[Zs|L]).

结果(压缩):[调试] 124 ?- line(7,R)。 1 7 21 35 35 21 7 1

预期结果(无 writeln):[1,7,21,35,35,21,7,1]

最佳答案

非常简单:描述列表时,始终考虑使用 符号。例如:

line(N, Ls):-
    phrase(line_(N, N), Ls).

line_(_, 0) --> [1].
line_(N, K) --> [C],
    { K > 0,
      K1 is K-1,
      coefficient(N, K, C) },
    line_(N, K1).

示例查询:

?- line(3, Ls).
Ls = [1, 3, 3, 1] ;
false.

就我个人而言,我不再愿意在 Prolog 中进行低级整数运算,所以我实际上建议使用 Prolog 程序中所有整数算术的约束:

:- use_module(library(clpfd)).

line(N,Ls):-
    phrase(line_(N, N), Ls).

line_(_, 0) --> [1].
line_(N, K) --> [C],
    { K #> 0,
      K1 #= K-1,
      coefficient(N, K, C) },
    line_(N, K1).

如果您在整个程序中一致地使用 CLP(FD) 约束,您通常会获得可在各个方向使用的更一般的关系。

当然,您也可以在没有 DCG 的情况下执行此操作,但随后您需要更多参数和更多变量,这使得代码有点难以理解。

关于prolog - 具有二项式系数的帕斯卡三角形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34614482/

相关文章:

prolog - 以秒为单位递增日期时间

java - 用于大型游戏的 Java 任务编辑器

c++ - C++中的Pascal Triangle递归程序优化

scala - 将普通递归转换为尾递归

java - 尝试使用 while 循环继续循环,直到用户输入 n (Java)

java - Java 中陷入帕斯卡三角形的困境

prolog - 检查列表是否仅包含零

prolog - 库(lambda)、柯里化(Currying)和 SWI Prolog 的问题

unit-testing - 在 Prolog 中测试。如何运行单元测试来检查我的输出文件是否与我的文本文件匹配?

c - 生成帕斯卡三角形的最佳方法