什么是递归?
程序调用自身的编程技巧称为递归。
递归的主要思考方式在于:把大事化小
递归的两个必要条件:
(1)跳出条件:存在限制条件,当满足这个限制条件时,递归便不再继续
(2)限制条件:每次递归调用之后越来越接近这个限制条件。
来看几组练习,看看递归是如何实现的?
----->1.
//接受一个整形值(无符号),把它转换成字符并打印它
//输入1234 输出 1 2 3 4
void print(int n)
{
if (n > 9)
{
print(n / 10);
}
printf("%d",n%10);
}
int main()
{
int num = 1234;
print(num);
system("pause");
return 0;
}
递归调用方式:
屏幕就会输出 1 2 3 4
------>2.
题目:编写函数不允许创建临时变量,求字符串长度:
方法实现:采用(递归)的方式
int my_strlen(char *str)
{
if (*str == '\0')
{
return 0;
}
else
{
return 1 + my_strlen(str + 1);//str指向a str+1指向b
}
}
int main()
{
char *p = "abcdef";
int len = my_strlen(p);
printf("%d\n",len);
system("pause");
return 0;
}
那么,上面这道题,你可以采用非递归实现吗?(计数器方式)
int my_strlen(char *str)
{
assert(str != NULL);
int count = 0;
while (*str != '\0')
{
count++;
str++;
}
return count;
}
int main()
{
char *p = "abcdef";
int len = my_strlen(p);
printf("%d\n", len);
system("pause");
return 0;
}
------>3.
题目:求n的阶乘
方法一:使用循环的方法实现
int Fac(int n)
{
int i = 0;
int ret = 1;
for (i = 1; i <= n; i++)
{
ret *= i;
}
return ret;
}
int main()
{
int num = 0;
int ret = 0;
scanf("%d",&num);
ret = Fac(num);
printf("%d\n", ret);
system("pause");
return 0;
}
方法二:使用递归的方法实现
int Fac(int n)
{
if (n <= 1)
return 1;
else
return n * Fac(n - 1);
}
int main()
{
int num = 0;
int ret = 0;
scanf("%d",&num);
ret = Fac(num);
printf("%d\n", ret);
system("pause");
return 0;
}
-------->3.
题目:求第n个斐波那契数列
方法一:递归
int Fib(int n)
{
if (n <= 2)
{
return 1;
}
else
return Fib(n - 1) + Fib(n-2);
}
int main()
{
int num = 0;
int ret = 0;
scanf("%d",&num);
ret = Fib(num);
printf("%d\n", ret);
system("pause");
return 0;
}
方法二:循环
int Fib(int n)
{
int a = 1;
int b = 1;
int c = 1;
while (n>2)
{
c = a + b;
a = b;
b = c;
n--;
}
return c;
}
int main()
{
int num = 0;
int ret = 0;
scanf("%d",&num);
ret = Fib(num);
printf("%d\n", ret);
system("pause");
return 0;
}
类似递归的问题还有许多,例如,汉诺塔问题,青蛙爬楼梯问题,多做多理解,加油!
递归比非递归的形式更为清晰,但是大多数问题迭代实现比递归实现效率更高,虽然代码可读性差。多用多体会!