1. 程式人生 > >某些函式的遞迴與非遞迴實現的比較

某些函式的遞迴與非遞迴實現的比較

1.斐波那契數列實現~

  遞迴實現:

int fib(int n)
{
	if (n == 1 || n == 2)
		return 1;
	else
		return fib(n - 1) + fib(n-2);
}
非遞迴(迭代法)實現:
int fib(int n)
{
	int num1 = 1;
	int num2 = 1;
	int num3 = 1;
	while (n > 2)
	{
		/*num3 = num1 + num2;
		num1 = num2;
		num2 = num3;*///以上三句語句等價於下邊兩句,不過,這三句應該返回num3
		num1 = num1 + num2;
		num2 = num1 - num2;
		n--;
	}
	return num1;
}
從以上兩種實現方法我們可以看出,遞迴程式碼比非遞迴簡單很多~不過,你是否知道遞迴背後的故事~如果我們要計

算第40個斐波那契數,計算機需要計算很多次:每個遞迴呼叫都觸發另外兩個遞迴呼叫,而這倆個遞迴呼叫又將

觸發遞迴呼叫。當我們計算fib(10)時,fib(3)被呼叫了21次,這個數目你可以在紙上推導。開銷太大。

所以,從時間和空間複雜度來看,還是非遞迴的好一些~

2.字串逆序~

非遞迴實現:

void reverse(char *left, char *right)
{
	while (left < right)
	{
		char tmp = *left;
		*left = *right;
		*right = tmp;
		left++;
		right--;
	}
}
遞迴實現:
void reverse_string(char* str)
{
	int len = Strlen(str);
	if (len > 1)
	{
		char tmp = str[0];
		str[0] = str[len - 1];
		str[len - 1] = '\0';
		reverse_string(++str);
		str[len - 1] = tmp;
	}
}
分析:非遞迴實現方法比遞迴好很多,非遞迴程式碼簡單易懂,遞迴程式碼實現原理:當字串長度大於1,遞迴起來

,將第一個字元放到臨時開闢的空間,最後一個字元放在第一個字元的位置,然後把原本放最後一個字元的位置清

為結束符,當遞迴結束時,把臨時區的變數放在所謂的字串的結尾~