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,递归起来
,将第一个字符放到临时开辟的空间,最后一个字符放在第一个字符的位置,然后把原本放最后一个字符的位置清
为结束符,当递归结束时,把临时区的变量放在所谓的字符串的结尾~