簡體   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