【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 

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;
}

你可能感兴趣的:(c语言,算法,数据结构)