目录
例一:求n!的阶乘
1*2*3……*n
运用for循环可以轻松写出代码:
#include<stdio.h>
int main()
{
int n = 0;
scanf_s("%d", &n);
int i = 0;
int tmp = 1;
for (i = 1; i <= n; i++)
{
tmp = tmp * i;
}
printf("%d\n", tmp);
return 0;
}
循环是迭代的一种形式
运用递归也可以写出代码:
#include<stdio.h>
int Fac(int n)
{
if (n <= 1)
{
return 1;
}
else
return n * Fac(n - 1);
}
int main()
{
int n = 0;
scanf_s("%d", &n);
int ret = Fac(n);
printf("%d\n", ret);
return 0;
}
例二:求第n个斐波那契数
Fib(n)
n<=2时, 1
n>2时, Fib(n-1)+Fib(n-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_s("%d", &n);
int ret = Fib(n);
printf("%d\n", ret);
return 0;
}
但效率太低了,进行了大量重复的计算,输入n=50,代码要跑5分钟左右,同样一个数要算好几遍
那用循环是否更快捷呢:
#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_s("%d", &n);
int ret = Fib(n);
printf("%d\n", ret);
return 0;
}
我们发现用for循环代码运行的效率非常高,所以说当有公式的时候用递归代码书写的非常简单,但效率不一定高。递归是从结果开始,从后往前进行推演,而循环是从前往后进行推演。
例三:汉诺塔问题 (之后会专门展开研究)
例四:青蛙跳台阶问题