递归思考方式:大事化小;常见错误:栈溢出
递归存在两个必要条件:存在限制条件,当满足这个限制条件的时候,递归便不再继续
每次递归调用之后越来越接近这个限制条件
1.输入一串数字,单个打印数字
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
void print(int n)
{
if (n > 9)
{
print(n / 10);
}
printf("%d ", n % 10);
}
int main()
{
//函数递归
unsigned int num = 0;
scanf("%d", &num);
print(num);
return 0;
}
2.不添加变量,计算字符串长度
#include<stdio.h>
#include<string.h>
int my_strlen(char* str)
{
int count = 0;
//计算字符串的长度
while (*str != '\0')
{
count++;
str++;
}
return count;
}
//不添加变量,求字符串长度
//my_strlen("bit")
//1+my_atrlen("it")\
//1+1+my_strlen("t")
//1+1+1+my_strlen("")
//1+1+1+0
//int my_strlen(char* str)
//{
// if (*str != 0)
// return 1 + my_strlen(str + 1);
// else
// return 0;
//}
//
int main()
{
char arr[] = "bit";
//int len=strlen(arr);
//printf("%d ", len);
int len = my_strlen(arr);
printf("len=%d\n", len);
return 0;
}
3.n的阶乘
//用 递归的方式求n的阶乘
int Facl(int n)
{
int i = 0;
int ret = 1;
for (i = 1; i <= n; i++)
{
ret *= i;
}
return ret;
}
int Fac2(int n)
{
if (n <= 1)
return 1;
else
return n * Fac2(n - 1);
}
int main()
{
int n = 0;
int ret = 0;
scanf("%d", &n);
//ret = Facl(n);
ret = Fac2(n);
printf("%d\n", ret);
return 0;
}
4.描述第n个斐波那契数列
//描述第n个斐波那契数列,大量重复计算
//int Fib(int n)
//{
// 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);
ret = Fib(n);
printf("%d\n", ret);
return 0;
}