繁体   English   中英

Prolog无限递归无法填充堆栈?

[英]Prolog infinite recursion not filling up the stack?

使用以下示例,由于无限递归,堆栈快速填充...

is_pos_integer(X):- is_pos_integer(Y),X is Y+1.
is_pos_integer(0).

但是,下面的示例在运行并要求回溯(使用;)时,达到相同的无限递归而不会占用堆栈...

is_pos_integer(0).
is_pos_integer(X):- is_pos_integer(Y),X is Y+1.

我不相信任何一个函数都是尾递归的,那么为什么第二个函数不会引起........... StackOverflow? (yaaaaoww .... 太阳镜

假设您的查询类似于?- is_pos_integer(1)则说明如下:

第一个示例只是进入无限循环而不受尾递归的影响。 因此堆栈已满。

第二个示例也将最终完成,但非常缓慢。

让我们标记第一个子句A和第二个子句B。当您调用is_pos_integer(0)的第一个版本时,调用模式为AAAAA ...(堆栈外)。 当您调用第二个版本时,您会得到A(返回到顶层的true ),然后回溯BA,由于0不等于0 + 1而失败,然后BBA又由于0不等于1 + 1而失败,依此类推。您得到BB ... B(ntimes),然后A失败的呼叫。 最终,您将用完堆栈,但是要花很长时间。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM