[英]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.