作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
以下 Prolog 程序定义了一个谓词 fib/2
用于计算后继算术中整数的斐波那契数:
fib(0, 0).
fib(s(0), s(0)).
fib(s(s(N)), F) :-
fib(N, F1),
fib(s(N), F2),
sum(F1, F2, F).
sum(0, N, N).
sum(s(N1), N2, s(S)) :-
sum(N1, N2, S).
它适用于这种参数模式下的查询:
?- fib(s(0), s(0)).
true
; false.
它也适用于这种参数模式下的查询:
?- fib(s(0), F).
F = s(0)
; false.
它也适用于这种参数模式下的查询:
?- fib(N, F).
N = F, F = 0
; N = F, F = s(0)
; N = s(s(0)), F = s(0)
; N = s(s(s(0))), F = s(s(0))
; N = s(s(s(s(0)))), F = s(s(s(0)))
; …
但是在这种参数模式下它会耗尽资源:
?- fib(N, s(0)).
N = s(0)
; N = s(s(0))
;
Time limit exceeded
如何在所有参数模式的后继算术中实现斐波那契数列?
最佳答案
这个答案使用之前的两个计算值“自下而上”计算斐波那契数,因此它只会进行一次递归尾调用:
fib(0, 0).
fib(s(0), s(0)).
fib(s(s(X)), F):-
fib(X, 0, s(0), F, F).
fib(0, F_2, F_1, _, F):-
sum(F_2, F_1, F).
fib(s(X), F_2, F_1, s(Y), F):-
sum(F_2, F_1, F_0),
fib(X, F_1, F_0, Y, F).
sum(0, Y, Y).
sum(s(X), Y, s(Z)):-
sum(X, Y, Z).
至少在具有默认配置的 SWI 中,它耗尽了计算 fibonacci(37) 在 sum/3
中构建加法项的资源。
关于prolog - 如何在所有参数模式的后继算术中实现斐波那契数列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68873854/
我是一名优秀的程序员,十分优秀!