簡體   English   中英

序言中列表總和的迭代程序

[英]Iterative program for sum of list in prolog

嘿,我對序言遞歸和迭代有點困惑。 我在遞歸和迭代中分別給出列表總和的代碼,想知道它們中的每一個是否正確...

add_r([],0).   
add_r([H|T],X) :- add_r(T,X1),X is H + X1.

add_i(List,Sum) :- add_i(List,0,Sum).   
add_i([H|T],I,Sum) :- I1 is I + H , add_i(T,I1,Sum).   
add_i([], I1, I1).

這里add_r是遞歸程序,而add_i是迭代程序(根據我)...我可能是錯的。這里“ I”用於迭代控制。
如果我錯了,請糾正我。

嚴格地說,序言不允許重復,是因為變量是“一次編寫”(那種...)。

這兩個謂詞都是遞歸的,對我來說似乎是正確的。

它們之間的區別在於add_i是尾遞歸的 (遞歸調用最后出現),因此編譯器可以對其進行優化(請參閱上一次調用優化或Tail Call ),用jump代替遞歸調用,從而避免了線性堆棧add_r所需的空間。

如果使用Abelson&Sussman(計算機程序的結構和解釋)術語,那是非常正確的。

在這種情況下,“迭代”表示僅用幾個變量來充分描述過程的狀態,而“遞歸”表示每次調用時變量的數量都會增加。 另外,“遞歸”過程有兩個階段:增長和縮減,增長時會留下“選擇點”等(所有差異均在SICP中進行了描述)。

在Prolog中,就第二個示例而言,術語“尾遞歸”比“迭代”更常用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM