Prolog递归长度计数

时间:2017-11-18 12:24:50

标签: recursion prolog

这可能是一个简单/基本的问题,但我在抓住逻辑时遇到了麻烦。

我想使用递归来计算列表的长度。 想象一下这个问题有一个列表[a,b,c,d]。

我们有一个基本子句和一个递归子句,如下所示。 基本子句总是处理最基本的问题,在这种情况下是一个空列表。 recursive子句试图解决列表大小N-1的问题。

listLength([],0).

listLength([Head|Tail], Count):-
    listLength(Tail, PartialCount),
    Count is PartialCount+1.

现在,我的问题如下:

让我们看一下这段代码:

listLength(Tail, PartialCount)

程序将继续运行,直到Tail为空,然后传递给listLength([],0). PartialCount等于0。 然后,程序继续Count is PartialCount+1.,Count等于1.

然后程序开始回溯到其他“未解决”的长度。 首先它以[d]开头,因为这是它试图解决的最后一个元素,现在 PartialCount变为1 ,这是我不明白的。 为什么PartialCount突然变为“1”,这使得Count之后等于2,因为在程序中,没有重新定义PartialCount的迹象。

该程序还回溯到[c,d],这使得Partial Count等于2,依此类推。

有人可以解释这是怎么发生的吗?据我所知,在listLength([],0]示例中,PartialCount设置为“0”,但我不知道它的值是如何更新的? 我看到Count已更新,但未PartialCount

1 个答案:

答案 0 :(得分:2)

每次递归调用都有一个单独的PartialCount。这就像局部变量与全局变量一样。局部变量屏蔽具有相同名称的全局变量。最深嵌套中的局部变量掩盖了它外面的局部变量。

补充:以下是发生的事情:

Call [a,b,c,d]
  Call [b,c,d]
    Call [c,d]
      Call [d]
        Call []
        Success (first clause): Count = 0, no ParticalCount
      Success (2nd clause): PartialCount = 0, Count = 1
    Success (2nd clause): PartialCount = 1, Count = 2
  Success (2nd clause): PartialCount = 2, Count = 3
Success (2nd clause): PartialCount = 3, Count = 4