Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Prolog 斐波那契递归函子_Prolog_Fibonacci - Fatal编程技术网

Prolog 斐波那契递归函子

Prolog 斐波那契递归函子,prolog,fibonacci,Prolog,Fibonacci,我是Prolog的初学者,我想在这方面得到帮助 这个函子计算一个数的斐波那契。。。第一次它加上Y=0和Z=1,然后它称自己为wtih Y=Z和Z=Y+Z,每次它都增加计数器C的值,直到计数器等于X。。。。。 问题是结果总是等于1,因为prolog永远不会执行第二个子句,即使X不等于M,但我不知道为什么 X:要计算的斐波那契 Y:斐波那契数列中的第一个数 Z:斐波那契级数中的第二个数 C:初始值为0的计数器 T:Y+Z predicates fib_tail(integer,integer, in

我是Prolog的初学者,我想在这方面得到帮助 这个函子计算一个数的斐波那契。。。第一次它加上Y=0和Z=1,然后它称自己为wtih Y=Z和Z=Y+Z,每次它都增加计数器C的值,直到计数器等于X。。。。。 问题是结果总是等于1,因为prolog永远不会执行第二个子句,即使X不等于M,但我不知道为什么

X:要计算的斐波那契 Y:斐波那契数列中的第一个数 Z:斐波那契级数中的第二个数 C:初始值为0的计数器
T:Y+Z

predicates
fib_tail(integer,integer, integer,integer, real)
clauses
fib_tail(X,Y , Z,M, T):- X=M,T = Y + Z,!.
fib_tail(X,Y ,Z, C , T):-
  T = Y + Z,
  NY = Z,
  NZ = Y + Z,
  NC = C + 1,
  fib_tail(X, NY, NZ, NC, NT).

goal
fib_tail(5 ,0 ,1 ,0, T)

你的第二条谎言有两个缺陷:

  • X永远不会递增
  • NT是一个单例,因此不会向调用者“传输”任何值
编辑注释突出显示X不需要增加,与正确增加的C进行比较


我认为您应该在尝试实现双递归定义之前,以及在该定义起作用时优化删除代价高昂的调用。

您查看过该站点吗?序言教程@Ibrahim+1获得13点声誉!!继续并保持下去:):)为什么我需要增加X??你是对的,是C跟踪增加。是我的错。当我将目标更改为fib_tail(5,2,1,1,T)时,我将编辑答案。结果不等于1,我认为问题出在第二条,因为我从未执行过。。。。你这样认为吗?我认为你应该去掉(在第二条规则中)T=Y+Z,用T代替NT(单体),这样你就能得到计算结果。我的声望是6:(我不能投你的票。)对不起,投我的票来提高我的声望,这样我才能投你的票