#define _CRT_SECURE_NO_WARNINGS
函数递归
以大化小
最简单递归
#include<stdio.h>
int main()
{
printf("heh\n"); // Stack overflow // 栈溢出 |递归常见错误
main(); // 会进入无线循环
// 函数的调用都是在栈区
// stackoverflow.com | 程序员知乎
return 0;
}
递归策略只需要少量的程序就可描述出阶梯过程所需的多次重复计算
大大减少了程序的代码量
练习
接受一个整型值(无符号),按照顺序打印它的每一个。
如输入1234,输出1 2 3 4
void print(int n)
{
if (n > 9)// 递归应存在限制条件
{
print(n / 10);
}
printf("%d ", n%10);
}
// 存在限制条件,当满足这个限制条件的时候,递归便不再继续。
// 每次递归调用之后越来越接近这个限制条件
int main()
{
unsigned int num = 1234;// unsigned int 无符号整型
scanf("%d", &num);
//递归
print(num);
system("pause");
return 0;
}
求一个字符串长度 不允许创建临时变量
#include<stdio.h>
int my_strlen(char* str)
{
// 计算字符串的长度
int count = 0;// 还是创建了临时变量
while (*str != '\0')
{
count++;
str++;
}
return count;
}
利用递归的方法解决
int my_strlen(char* str)
{
if (*str != '\0') // *代表地址里面的内容
return 1 + my_strlen(str+1);
else
return 0;
}
// 把大事化小
// my_strlen("bit")
//1 + my_strlen("it")
//1+1+my_strlen("t")
// 1+1+1+my_strlen("")
// 1+1+1+0
int main()
{
char arr[] = "bit";
//int len = strlen("arr");// 求字符串长度
//printf("%d\n", len);
int len = my_strlen("arr");//arr 是数组,
//数组传参,传过去的不是整个数组,而是第一个元素的地址
// a r r \0
printf("%d\n", len);
system("pause");
return 0;
}
递归与迭代
联系 :求n的阶乘。(不考虑溢出)
int my_n(int x)// 递归的方式
{
if (x <= 1)
return 1;
else
return x*my_n(x - 1);
//my_n 1 -> n<=1
// n*my_n(n-1) -> n>1
}
int my_n(int x)// 循环的方式
{
int i = 0;
int ret = 1;
for (i = 1; i <= x; i++)
{
ret = ret*i;
}
return ret;
}
int main()
{
// 求n的阶乘
int n = 0;
int sum = 0;
scanf("%d",&n);
sum = my_n(n);
printf("%d\n", sum);
system("pause");
return 0;
}
求n个斐波那契数列
1 1 2 3 5 8 13 ···
Fib(n) = 1 -> n<=2
Fib(n-1)+Fib(n-2) -> n>2
int count = 0;
int Fib(int n)
{
if (n == 3)// 测试第三个斐波那契数的计算次数
{
count++;
}
if (n <= 2)
return 1;
else
return Fib(n - 1) + Fib(n - 2);// 会重复大量的计算
}
利用循环方式解决
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 n = 0;
int ret = 0;
scanf("%d", &n);
// Tdd - 测试驱动开发
ret = Fib(n);
printf("%d\n", ret);
//printf("count = %d\n", count);
system("pause");
return 0;
}