erlang雜記十二 再說尾遞迴

2021-09-30 10:16:16 字數 804 閱讀 8676

翻了一下list模組,看的時候,突然發現,尾遞迴其實是很容易展開成迴圈的。

想起讀書時剛開始學程式,c語言,一直再糾結的乙個問題,就是如何讓乙個函式返回兩個引數的結果,哈哈,不要笑我。

do_sth(, , sa, sb)->;
do_sth([ha|ta]=la,[hb|tb]=lb, sa, sb)->

do_sth(ta, tb, ha+sa,hb+sb).

用erlang隨便寫了乙個尾遞迴的函式,實現了對列表的一種計算

struct do_sth(vector:::iterator la, vector::iterator lb, int sa, int sb)else};

}

翻譯成c++大概就是這個樣子,**寫的很醜= =。

我覺得看尾遞迴**的時候,就當他是迴圈,就很容易看了,終止條件就是else,其它就計算完後重新執行自己這個函式。

寫尾遞迴也是這個思路,else上面的**就把事情做完,else下面的**就只做最後的清理,整理一下就是尾遞迴了。。

我覺得尾遞迴有乙個特點,就是把中間值傳到下一層遞迴裡面去了,就是第三第四個引數,

一般c++寫的遞迴是把中間值返回到上一層呼叫,然後繼續計算,然後再把結果返回上一層呼叫。

這種區別就使得一般的c++**一定要有個呼叫棧才能保證程式的正確性,如果把本層的計算結果傳入到下一層進行計算,那麼這個呼叫棧就不需要了,

就像完成了一次goto的過程。

即尾遞迴的計算順序與遞迴是相反的。

Erlang開發建議 雜記版

以下是在erlang專案開發中的一些記錄,即包含很多通俗易懂的原則,也包含一些似是而非的建議,比較混亂,還沒有積累到乙個可以分門別類的地步,各位就將就看吧.確保沒有任何編譯警告 erlang中string採用list實現,32位系統中,其1個字元用8個位元組的空間 4個儲存value,4個儲存指標 ...

雜記十二 定時任務框架Quartz

quartz是opensymphony開源組織在job scheduling領域又乙個開源專案。quartz的基本組成部分 job要點 實現job介面,重寫execute方法,方法內是具體的任務邏輯 public class printwordsjob implements job public c...

Erlang 十二 列表推導 實現對列表的排序

將乙個數字列表由小到大進行排序 list.erl module list export sortnum 1 對純數字列表排序 從小到大 num 當前的數字,列表中第乙個數字 list 取出第乙個數字後,其餘的列表 sortnum num list 通過列表推導,找到比當前數字小的數字列表 sortn...