SWI-Prolog的递归( 二 )


1 , 1 , 2 , 3 , 5 , 8 , 13 , 21 , 34 , 55 , ……
通式为:
f(1) = 1 (两个遏制前提)
f(2) = 1
f(n) = f(n-1) + f(n-2) (递归法则)

SWI-Prolog的递归

文章插图

2这里用Num1、Num2这两个变量别离来暗示序数Num项的前面两项;变量Term1和Term2别离暗示前两项斐波那契数的成果 。 来转换当作Prolog法式如下图所示:

SWI-Prolog的递归

文章插图

3运行后的成果如下图所示 。 从截图可以看出 , 这些递归的法式还存在一些问题 , 好比在已经得出成果后 , 若是按“;”键试图查找另一个解时 , 会呈现错误的谜底 , 甚至起头报错 。 因为若是查找另一个成果 , 会从头进入递归前提 , 会再次减去数字 , 因而会报错 。 我将会鄙人次介绍Prolog的另一个机制——截断 。

SWI-Prolog的递归

文章插图

总结1以上几个实例用于申明递归的Prolog法式 。 年夜大都较年夜的Prolog法式都可能包含递归 , 递归是年夜大都Prolog法式中的本家儿要节制手段 。
在编写递归途序时 , 应服膺下述几点:
?所有递归法则都必需有遏制前提 , 若是没有遏制前提 , 递归法则将无尽头地递归下去 。
?一般环境下 , 遏制前提应该放在常识库中递归法则的上方 。 因为若是总找不到遏制前提 , 也将导致无限递归 。
?凡是 , 在编写Prolog法式时应尽量采用递归 , 这要求自问如下问题:
?是否可以把问题用其自身表达出来?
?遏制前提是什么?

SWI-Prolog的递归

文章插图

2总的来说 , 递归法则具有下列一般形式:
递归法则的遏制前提.
递归谓词 :-
    某些初始计较,
    递归谓词,
    某些最终运算.

SWI-Prolog的递归

文章插图

注重事项在编写好法式可以操纵调试来体味递归的机制 。

以上内容就是SWI-Prolog的递归的内容啦 , 希望对你有所帮助哦!

推荐阅读