一、函数的递归
1、递归的思想
递归是通过函数的调用函数来实现的一直思想称为递归,递归的结构可以把大事化小一步一步解决,代码量大大减小。
2、递归的使用条件
当一个问题可以被拆分成多个相似的问题就可以考了递归,递归需要有结束条件,不然往往会产生无法结束的死递归。
3、递归时肯能出现的问题
递归会出现死递归,就是没有结束条件,不断的调用下去,在设置递归时每次递归尽量不断接近这个结束条件才行。
出来死递归,还有可能产生栈溢出的现象。
栈溢出是应为递归层次太深,不停使用内存分配的空间,递归没有结束,内存不归还,导致分配的内存空间被用完,就是栈溢出。
4、递归使用的例题
1、使用递归算出n的阶乘
#include<stdio.h>
int factorial(int n)
{
if (n > 0)
{
return n * factorial(n - 1);
}
else
return 1;
}
int main()
{
int n = 0;
scanf("%d", &n);
printf("%d\n", factorial(n));
return 0;
}
2、使用递归算出第n个斐波那契数
#include<stdio.h>
int fibonacci(int n)
{
if (n > 2)
{
return fibonacci(n - 1) + fibonacci(n - 2);
}
else
return 1;
}
int main()
{
int n = 0;
scanf("%d", &n);
printf("%d\n", fibonacci(n));
return 0;
}
二、函数的迭代
1、迭代的好处
虽然递归的代码量小,但效率低,当递归的数字大时,运算量巨大,会有巨大的重复计算,执行效率低,占用内存大。
当使用迭代时效率会大大提升。
2、迭代例题
1、使用迭代算n的阶乘
#include<stdio.h>
int factorial(int n)
{
int ret = 1;
for (int i = 1; i <= n; i++)
{
ret *= i;
}
return ret;
}
int main()
{
int n = 0;
scanf("%d", &n);
printf("%d\n", factorial(n));
return 0;
}
2、使用迭代算出第n个斐波那契数
#include<stdio.h>
int fibonacci(int n)
{
int a = 1, b = 1, c = 1;
for (int i = 3; i <= n; i++)
{
c = a + b;
a = b;
b = c;
}
return c;
}
int main()
{
int n = 0;
scanf("%d", &n);
printf("%d\n", fibonacci(n));
return 0;
}
用迭代算第45个斐波那契数也是一下就算出来了!