erlang遞迴和尾遞迴
非尾遞迴
sum_1(0) ->
0;sum_1(N) ->
sum_1(N-1) + N.
尾遞迴
sum_2(N,0).
sum_2(0,Sum) ->
Sum;
sum_2(N,Sum) ->
sum_2(N-1,Sum + N).
遞迴:不斷呼叫自身函式,直到遇見結束條件。
非尾遞迴的流程:以sum_1(N)為例,在N不等於0之前,呼叫sum_1(N-1),棧需要記錄這個點,以便返回計算結果後加上N。
尾遞迴的流程:以sum_2(N)為例,在N不等於0之前,呼叫sum_1(N-1,Sum+N),棧只需要記錄Sum。
尾遞迴優勢:如果N足夠大,可能造成棧溢位,但是兩種遞迴各有優勢,當Sum的資料很複雜,尾遞迴效率就會受到限制,總之具體情況,選擇合適的遞迴。
如何區別:個人的方法是,看函式的返回,如果只有一個值,直接返回,則是尾遞迴,反之為非尾遞迴。
另外:
length(List)會遍歷整個列表,
不建議用在
loop(List) when length(List) > 0 ->
todo;
loop(List) ->
todo.
時間消耗和List長度成正比,儘量使用 [ ] 匹配區別。
相關推薦
erlang遞迴和尾遞迴
非尾遞迴 sum_1(0) -> 0; sum_1(N) ->sum_1(N-1) + N. 尾遞迴 sum_2(N) ->sum_2(N,0). sum_2(0,Sum) -> Sum; sum_2(N,Sum) ->sum_2(N-1,S
JavaScript 普通遞迴和尾遞迴函式
遞迴函式是自己呼叫自己的函式。 遞迴函式執行時會形成一個呼叫記錄,當子一層函式程式碼執行完成之後父一層函式才會銷燬呼叫記錄,這就形成了呼叫棧。棧的疊加可能會產生記憶體溢位。 n的階乘 //案例一 普通遞迴function factorial(n){ if( n === 1) return
遞迴函式——頭遞迴和尾遞迴
學習總結自《像程式設計師一樣思考》V.Anton Spraul 著,徐波 譯 遞迴,也就是一個函式直接或間接呼叫自身。 一般來說,遞迴可以分為直接遞迴和間接遞迴。直接遞迴,是指函式自己呼叫自己的情況,而間接遞迴,是指呼叫其他函式時,在其他函式中又呼叫了自己的情況。 現在,
演算法精解-C語言描述 遞迴和尾遞迴 (圖解+例項)
遞迴是一種強大的方法,它允許一個物件以其自身更小的形式來定義自己。 讓我們來觀察一下自然界中出現的遞迴現象:蕨類植物的葉子,每片葉子葉脈中的小分支都是整片葉子的較小縮影;又或者兩個反光的物體,相互對映對方漸遠的影像。這樣的例子使我們明白,儘管大自然的力量是強大的,在許多方面
利用階乘講普通遞迴和尾遞迴
階乘是一個很基本的數學問題,n!=n*(n-1)*(n-2)*...*2*1,利用程式來解決階乘問題比較簡單,可以利用迴圈或者遞迴,這裡講兩種遞迴方法。 第一種:普通遞迴: int factorial(int n) { if(n==1 || n==0
猴子吃桃遞迴和尾遞迴--JavaScript版
有一隻猴子摘了一堆桃子,當即吃了一半,可是桃子太好吃了,它又多吃了一個,第二天它把第一天剩下的桃子吃了一半,又多吃了一 個, 就這樣到第十天早上它只剩下一個桃子了,問它一共摘了多少個
遞迴和尾遞迴優化
遞迴 遞迴簡而言之就是自己呼叫自己。使用遞迴解決問題的核心就是分析出遞迴的模型,看這個問題能拆分出和自己類似的問題並且有一個遞迴出口。比如最簡單的就5的階乘,可以把它拆分成5*4!,然後求4!又可以呼叫自己,這種問題顯然可以用遞迴解決,遞迴的出口就是求1!,可以
關於尾呼叫和尾遞迴
1. (1)尾呼叫:指某個函式的最後一步是呼叫另一個函式。 例如: function a(n){ return b(n); } (最後一步呼叫並不意味著在函式的尾部,只要是最後一步即可) function a(n){ if(n>
遞迴、尾遞迴和函數語言程式設計
<span style="font-family:SimSun">function fibonacciDynamically(n){ var fibonacci =new Array(n+1); return calculate(n); } function calculate(n){ if
erlang迴圈結構:尾遞迴,列表解析
最近看到一道erlang面試題,要求分別用尾遞迴,lists模組,列表解析找出0-9的偶數。 -module(test). -export([tail_loop/0, lists_func/0, list_comp/0]). % 尾遞迴 tail_loop() -&
一列數字的規則如下;1,1,2,3,5,8,13,21,34........ 求第30位數字是多少,用遞規和非遞迴兩種方法演算法實現
斐波納契數列(Fibonacci Sequence),又稱黃金分割數列。在數學上,斐波納契數列以如下被以遞迴的方法定義:F0=0,F1=1,Fn=F(n-1)+F(n-2)(n>=2,n∈N*)在現代物理、準晶體結構、化學等領域,斐波納契數列都有直接的應用,現在我從演算法的角度,利用遞迴和非
二叉樹的前序,中序,後序的遍歷的遞迴和非遞迴程式碼-C語言
#include <stdio.h> #include<stdlib.h> /* run this program using the console pauser or add your own getch, system("pause") or input l
二叉樹的前中後序遍歷(遞迴和非遞迴版本)
各位讀者週末愉快呀,今天我想來說說一道很常見的面試題目 —— 關於二叉樹前中後序遍歷的實現。本文將以遞迴和非遞迴方式實現這 3 種遍歷方式,程式碼都比較短,可以放心食用。 先簡單說明一下這 3 種遍歷方式有什麼不同 —— 對於每種遍歷,樹中每個結點都需要經過 3 次(對於葉結點,其左右子樹視為空子樹),但前
【演算法】二叉樹的遞迴和非遞迴遍歷(轉)
原文地址 【寫在前面】 二叉樹是一種非常重要的資料結構,很多其它資料結構都是基於二叉樹的基礎演變而來的。對於二叉樹,有前序、中序以及後序三種遍歷方法。因為樹的定義本身就 是遞迴定義,因此採用遞迴的方法去實現樹的三種遍歷不僅容易理解而且程式碼很簡潔。而對於樹的遍歷若採用非遞迴的方法,就要採
leetcode 783. 二叉搜尋樹結點最小距離(遞迴和非遞迴實現java)
題目描述: 給定一個二叉搜尋樹的根結點 root, 返回樹中任意兩節點的差的最小值。 示例: 輸入: root = [4,2,6,1,3,null,null] 輸出: 1 解釋: 注意,root是樹結點物件(TreeNode object),而不是陣列。 給定的樹 [4,
No.19程式碼練習:斐波那契數列,某數k次冪,模擬實現strlen(),階乘 ,逆置字串(遞迴和非遞迴)
學習不易,需要堅持。 遞迴 程式呼叫自身的程式設計技巧稱為遞迴( recursion)。遞迴做為一種演算法在程式設計語言中廣泛應用。 一個過程或函式在其定義或說明中有直接或間接呼叫自身的一種方法,它通常把一個大型複雜的問題層層轉化為一個與原問題相似的規模較小的問題來求解,遞迴策略只需
楊氏矩陣查詢數字(遞迴和非遞迴)
楊氏矩陣 有一個二維陣列. 陣列的每行從左到右是遞增的,每列從上到下是遞增的. 在這樣的陣列中查詢一個數字是否存在。 要求:時間複雜度小於O(N); 例: 1 2 3 4 5 6
求第n個斐波那契數(分別用遞迴和非遞迴兩種方法求解)
斐波那契數列指的是這樣一個數列 1, 1, 2, 3, 5, 8, 13, 21, 34, 55……這個數列從第3項開始,每一項都等於前兩項之和。 這裡分別用遞迴和非遞迴的方法實現: 遞迴 #define _CRT_SECURE_NO_WARNINGS 1 #include&l
c++二叉樹的遞迴和非遞迴的前序中序和後序遍歷以及層序遍歷
二叉樹的遞迴版的前序,中序和後序遍歷很簡單也很容易理解,這裡就放一個前序遍歷的例子 //前序遍歷遞迴演算法,遞迴演算法都大同小異,這裡就不一一列舉了 void binaryTree::pro_order(NodeStack::Node *t) { NodeStack::Node *h = t;
猴子吃桃問題,用遞迴和非遞迴方法
猴子吃桃問題:猴子第一天摘下若干個桃子,當即吃了一半,還不過癮,又多吃了一個 第二天早上又將剩下的桃子吃掉一半,又多吃了一個。以後每天早上都吃了前一天剩下的一半零一個。到第10天早上想再吃時,見只剩下一個桃子了。求第一天共摘了多少。 public class Test{ &nb