作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我要生成所有毕达哥拉斯三元组 (每次用户通过在 prolog 中使用 ; 要求新的解决方案时生成一个新的三元组)。
我试图修改下面的代码,它显示了给定 N 值(最大限制)的所有勾股数三元组。
生成高达给定值 N 的三元组的原始算法:
pythagora(X,Y,Z,N) :-
length(_, N),
between(1,N,X),
between(1,N,Y),
between(1,N,Z),
Z*Z =:= X*X + Y*Y.
inf
或
infinite
但显然程序死了。除了
between
,我还能使用哪些谓词?生成数字进行测试?
pythagora(X,Y,Z):- between(1,inf,X), between(1,inf,Y), between(1,inf,Z), Z*Z =:= X*X + Y*Y.
最佳答案
您提出的方法的问题在于 X
和 Y
通过 between/3
设置电话,然后 Z
也设置好了。现在不管是否Z*Z =:= X*X + Y*Y
与否,我们只会增加 Z
,直到无穷大。所以在 Z
的某个值之后, 永远不会再生成勾股三元组,但是 between/3
将继续为 Z
提出新值.
我们可以通过先设置Z
来解决问题(这里总是三元组的最大值)。那么我们知道X
和 Y
将始终在 1
之间和 Z
(好吧,界限可以设置得更“紧”,但我将此作为练习),因此我们可以将其实现为:
pythagora(X,Y,Z) :-
between(1, inf, Z),
between(1, Z, X),
between(1, Z, Y),
Z*Z =:= X*X + Y*Y.
X
和
Y
由
between/3
统一调用,使用有限数量的值,我们确信这些调用最终会结束,因此我们将尝试为
Z
寻找更高值的三元组。 .
?- pythagora(X, Y, Z).
X = 3,
Y = 4,
Z = 5 ;
X = 4,
Y = 3,
Z = 5 ;
X = 6,
Y = 8,
Z = 10 ;
X = 8,
Y = 6,
Z = 10 ;
X = 5,
Y = 12,
Z = 13 ;
X = 12,
Y = 5,
Z = 13 ;
X = 9,
Y = 12,
Z = 15
X
总是小于
Y
:
pythagora(X,Y,Z) :-
between(1, inf, Z),
between(1, Z, X),
between(X, Z, Y),
Z*Z =:= X*X + Y*Y.
?- pythagora(X, Y, Z).
X = 3,
Y = 4,
Z = 5 ;
X = 6,
Y = 8,
Z = 10 ;
X = 5,
Y = 12,
Z = 13 ;
X = 9,
Y = 12,
Z = 15 ;
关于prolog - 生成毕达哥拉斯三元组到无穷大,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52967915/
我是一名优秀的程序员,十分优秀!