1. 程式人生 > >【演算法】遞迴、迭代、迴圈

【演算法】遞迴、迭代、迴圈

一、遞迴

(一)介紹

1. 遞迴是 一個過程或函式在其定義或說明中有直接或間接呼叫自身的一種方法,它通常把一個大型複雜的問題層層轉化為一個與原問題相似的規模較小的問題來求解,遞迴策略只需少量的程式就可描述出解題過程所需要的多次重複計算,大大地減少了程式的程式碼量。遞迴的能力在於用有限的語句來定義物件的無限集合。一般來說,遞迴需要有邊界條件、遞迴前進段和遞迴返回段。

2. 遞迴的兩個關鍵點:遞迴邊界和遞迴公式

3.遞迴的優點:把大型複雜問題轉化為一個規模較效的問題,減少程式碼量

4.遞迴的缺點:遞迴到一定程度,會發生棧溢位;重複計算的次數多,效率低

(二)例子

1.斐波那契數列:f(n)=f(n-1)+f(n-2)(n>2) f(0)=1;f(1)=1; 

程式:

int F(int i)
{
	while(i == 0||i == 1) //遞迴邊界
	{
		return 1;
	}
	return F(i-1)+F(i-2); //遞迴公式
}

測試用例:

void FibonacciTest()
{
	int n =9;
	for ( int i =0;i< n;i++)
	{
		int a = F(i);
		std::cout << "第" << i << "個" <<"斐波那契數列值為:" << a <<endl;
	}
	
}

輸出:

複雜度:

時間:O(2^n) 空間:O(n)

2. 階乘:f(n)=n*(n-1)*...*1 簡化為:f(0)=1; f(n) = f(n-1)*n (n>0)

程式:

int Factorial(int n)
{
	while(n == 0) //遞迴邊界
	{
		return 1;
	}
	return Factorial(n-1)*n; //遞迴公式
}

測試用例:

void FactorialTest()
{
	int n = 5;
	std::cout << "階乘" << n << "的值:" << Factorial(n) <<endl;
}

輸出:

複雜度:

時間:O(2^n) 空間:O(n)

二、迭代

(一)介紹

迭代:利用變數的原值推算出變數的一個新值.如果遞迴是自己呼叫自己的話,迭代就是A不停的呼叫B。

三、迴圈

(一)介紹

在滿足條件的情況下,重複執行同一段程式碼

四、遍歷

(一)介紹

指的是按照一定的規則訪問樹形結構中的每個節點,而且每個節點都只訪問一次。