🌿🌿前言
🔆🔆什么是递归?
🎧🎧递归的两个必要条件
👻👻递归实例
⛳️实例1(按照顺序打印一个数的整形值)
参考代码(可以先去尝试是否可以解决问题)
🏌画图讲解
🌐程序运行结果
🛠完整代码
#include <stdio.h>
void print(int n)
{
if(n>9)
{
print(n/10);
}
printf("%d ", n%10);
}
int main()
{
int num = 1234;
print(num);
return 0;
}
🐴实例2 (使用函数在不创建变量的情况下求字符串长度)
参考代码
🚁画图讲解
👿程序运行结果
😗完整代码
#include <stdio.h>
int Strlen(const char* str)
{
if (*str == '\0')
return 0;
else
return 1 + Strlen(str + 1);
}
int main()
{
char* p = "abcd";
int len = Strlen(p);
printf("%d\n", len);
return 0;
}
😁😁递归与迭代
对于递归与迭代,我们同样通过两个实例来理解:
🕹实例1 (求n的阶乘)
方法一(使用递归)
参考代码
通过数学方法讲解
完整代码
#include <stdio.h>
int fac(int n)
{
if (n == 1)
return 1;
else
return n * fac(n - 1);
}
int main()
{
int n = 0;
scanf("%d", &n);
int ret = fac(n);
printf("%d\n", ret);
return 0;
}
方法二(使用迭代)
完整代码
#include <stdio.h>
int main()
{
int n = 0;
scanf("%d", &n);
int i = 0;
int ret = 1;
for (i = 1; i <= n; i++)
{
ret *= i;
}
printf("%d\n", ret);
return 0;
}
运行结果
😆实例2 (求解斐波那契数列)
🔍方法一 (递归求解)
参考代码
💰通过数学方法求解
运行结果
完整代码
#include <stdio.h>
int fib(int n)
{
if (n <= 2)
return 1;
else
return fib(n - 1) + fib(n - 2);
}
int main()
{
int n = 0;
scanf("%d", &n);
int ret = fib(n);
printf("%d\n", ret);
return 0;
}
运行结果
🐷方法二(迭代求解)
参考代码 (主函数不变)
画图讲解
📯完整代码
#include <stdio.h>
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;
scanf("%d", &n);
int ret = fib(n);
printf("%d\n", ret);
return 0;
}
💜运行结果
这时候我们会想:
为什么有时候用递归简便,而有时候用迭代简便呢?