这可能是一个简单/基本的问题,但我在抓住逻辑时遇到了麻烦。
我想使用递归来计算列表的长度。 想象一下这个问题有一个列表[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
答案 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