某些函式的遞迴與非遞迴實現的比較
阿新 • • 發佈:2019-02-19
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,遞迴起來
,將第一個字元放到臨時開闢的空間,最後一個字元放在第一個字元的位置,然後把原本放最後一個字元的位置清
為結束符,當遞迴結束時,把臨時區的變數放在所謂的字串的結尾~