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