我正在尝试找到一个关于广义Fibonacci序列(GFS)的查询的解决方案。查询是:是否有任何GFS有885作为他们的第12个数字?最初的2个数字可能会被限制在1到10之间。
我已经找到了解决方案,以从(1,1)开始的序列中找到第N个数字,其中我明确定义了初始数字。以下是我对此的看法:
fib(1, 1).
fib(2, 1).
fib(N, X) :-
N #> 1,
Nmin1 #= N - 1,
Nmin2 #= N - 2,
fib(Nmin1, Xmin1),
fib(Nmin2, Xmin2),
X #= Xmin1 + Xmin2.
对于上面提到的查询,我认为以下方法可以解决这个问题,我重复使用fib方法而不明确定义初始数字,因为现在需要动态完成:
fib(N, X) :-
N #> 1,
Nmin1 #= N - 1,
Nmin2 #= N - 2,
fib(Nmin1, Xmin1),
fib(Nmin2, Xmin2),
X #= Xmin1 + Xmin2.
fib2 :-
X1 in 1..10,
X2 in 1..10,
fib(1, X1),
fib(2, X2),
fib(12, 885).
......但这似乎不起作用。
这种方式不可能定义初始数字,还是我做了一些非常错误的事情?我不是要求解决方案,但任何可以帮助我解决这个问题的建议都将非常感激。
答案 0 :(得分:6)
在SWI-Prolog下:
:- use_module(library(clpfd)).
fib(A,B,N,X):-
N #> 0,
N0 #= N-1,
C #= A+B,
fib(B,C,N0,X).
fib(A,B,0,A).
task(A,B):-
A in 1..10,
B in 1..10,
fib(A,B,11,885).
答案 1 :(得分:2)
定义谓词gfs(X0,X1,N,F),其中X0和X1是基本情况0和1的值。
答案 2 :(得分:1)
可能不是严格意义上的解决方案,但我将永远分享它。可能唯一的收获就是表明,这既不需要计算机也不需要计算器来解决。如果你知道这个技巧可以在熊市上完成。
如果F_n是普通Fibo序列的第n个项,从F_1 = F_2 = 1开始,那么广义序列的第n个项将是G_n = F_ {n-2} * a + F_ {N-1} * b。 定义F _ { - 1} = 1,F_0 = 0
(的确,通过归纳
)
因此G_12 = F_10 * a + F_11 * b = 55a + 89b。
现在,您可以使用计算机搜索等式55a + 89b = 885的解法
OR
做数学:
补遗mod 11(explanation):
55a + 89b = 0 + 88b + b = b; 885 = 880 + 5 = 80 * 11 + 5 = 5
因此b = 5 mod 11,但由于1 <= b <= 10,b确实是5.89 * 5 = 445和885-445 = 440.现在,除以55得到a = 8。
答案 3 :(得分:0)
我说你做的事情非常糟糕......
当您致电fib(1, X1)
时,变量X1是函数fib
将返回的数字,在这种情况下,它将为1,因为基本情况为fib(1, 1).
。
答案 4 :(得分:0)
没有基本情况,fib / 2没有解决方案;无论你怎么称呼它在fib2。 注意:如果使用递归,则至少需要一个基本情况。
答案 5 :(得分:0)
考虑fib(N,F1,F2)
,这样您就可以使用简单fib(Nmin1, Xmin1)
替换fib(Nmin2, Xmin2)
和fib(Nmin2, Xmin2, Xmin1)
。