翻了一下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...