【c语言初阶】函数_递归和迭代
前言:
内容:
n的阶乘的公式,什么情况,怎么没有听懂
我咋知道n的阶乘公式啊
就是这个,老师说知道n的阶乘公式就容易写递归函数了,算了没阿关系
n!(fac(n))
1 ,n<=1
n*fac(n-1)
计算n的阶乘 ,循环的方式
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", ret);
return 0;
}
可以用循环的方式写
int main()
{
int n = 0;
int i = 0;
int ret = 1;
scanf("%d", &n);
for(i=1; i <= n; i++)
{
ret = ret * i;
}
printf("%d", ret);
return 0;
}
用函数的方式写递归,主要写功能
很奇怪,就是主函数里的for循环里的变量,出了作用域还没有失效,就是出了for循环,他还将值带出来了,难道我对作用域了解的还是不够清楚,在去了解一下
int fac(int n)
{
int i = 0; //将功能所用到的变量都初始化
int ret =1;
for(i=1; i <= n; i++) //这就是功能里的变量,然后就是要初始化这里的
{
ret = ret * i;
}
return ret;
}
斐波那契数列,这个我还不知道是什么意思
就是求数列,不晓得,麻烦,就是猜解一个数字,直到那个数字为1,或者是2,2就是1,
然后把1全部加起来
这里需要考虑的是,就是自定义函数定义的count,如果要打印的话,这个就需要是全局变量,但是放到主函数,自定义函数又找不到,所以就放到了最上面
用递归的方法表示为
#include <stdio.h>
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 main()
{
int n = 0;
scanf("%d", &n);
int relt = Fib(n);
printf("%d\n", relt);
printf("%d\n", count);
return 0;
}
用迭代的方式解决斐波那契数列
就是有一定的规律的
1 1 2 3 5 8 13 21 34 55
a b c //第一次
a b c //第二次,就是需要把上面的的b赋值到a,然后c赋值到b
//然后加起来,就是第二次的c了,然后反复循环就可以了
就是钱前两个数加起来的和,就是后面的数了
也就是说前面两个数是确定的,然后就是c = a+b
然后就需要改变a,b的值,
用的for循环,好像也可以,都是从3开始的,然后就是3循环1次,4循环两次
int Fib(int n)
{
int i = 0;
int a = 1;
int b = 1;
int c = 0;
for(i = 3; i <= n; i++)
{
c = a+b;
a = b;
b = c;
}
return c;
}
int main()
{
int n = 0;
scanf("%d", &n);
int m = Fib(n);
printf("%d", m);
return 0;
}