函数的 递归 和 迭代

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


函数的递归

递归的含义,在C语言中函数自己调用自己就叫做函数的递归

递归的思想:把复杂的问题简单化,每次递归都在无限接近这个极限

递归是有限制条件,满足了限制条件时,递归不再继续

写一个阶乘的实现操作

 int Fact (int n)
 {
	 if (n == 0)
		 return 1;
	 else if (n > 0)
		 return n * Fact (n - 1);
 }
int main()
{
	int a = 0;
	scanf("%d", &a);
	int z = Fact(a);
	printf("%d\n", z);
	return 0;
}

递归的思想体现在求5的阶乘就是等于 5*4的阶乘,再把4从新运用到递归函数中从新使用,也就是从新把值在放到最开始的Fact里面,依次进行,直到减为0,返回值为1,得到最终结果.

对于递归函数中栈区的使用和对内存的占取问题

一直向内存申请空间直到输出结果时停止.

 ------ 将一个数字从左到右依次打印在屏幕上,例如1234,先打印千位1,再打印百位2,再打印十位3,再打印个位4.代码如下:

void Print(int n)
{
	if (n > 9)
		Print(n / 10);
	printf("%d ", n % 10);
	
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	Print(n);
}

此递归函数如下,红色代表往下进行递归,蓝色代表往上进行返回,这样就可以基本实现一个函数的递归操作了,但是对于初学者理解起来还是有一定难度的,试着慢慢取理解一下.

我在每一个调用函数函数前面都加上了return 0;也是没有问题的,更好地去理解对于函数的返回问题.

递归过程中容易出现的问题分析

在C语言的每一次调用的时候,都需要为本次函数调用在内存的栈区申请一些空间来保存函数调用期间各种局部变量的值,这块空间叫做运行时的堆栈,或者函数栈帧,如果函数不返回,函数对应的栈帧空间就一直被占用,如果递归太深,就会浪费太多的栈帧空间,会引起栈溢出的问题.

对于n的阶乘还可以循环的方式来实现,操作起来也是非常容易,我们可以去引入一个新的变量i,(i<所给的变量n),代码如下所示:

int Fact(int n)//定义的循环方式来实现阶乘
{
	int i = 0;
	int ret = 1;
	for (i = 1;i <= n;i++)
	{
		ret *= i;
	}
	return ret;
}

int main()
{
	int n = 0;
	scanf("%d", &n);
	int z = Fact(n);
	printf("%d\n", z);
	return 0;
}

注意的重点!!!!!!

1.我们新定义的函数Fact中,我们在定义函数中最后返回的值ret,其实就相当与主函数中,阶乘的结果z,在对z进行打印,得出结果.

2.我们在定义函数中定义的ret=1!!,一定要切记,ret = 1,从1开始阶乘到n.

二、对于斐波那契数列的实现

代码如下(示例):

int Fib(int n)
{
	if (n <= 2)
		return 1;
	else
		return Fib(n - 1) + Fib(n - 2);

}
int main()
{
	int i = 0;
	scanf("%d", &i);
	int r = Fib(i);//定义一个值对于第几个斐波那契数进行输出
	printf("%d\n", r);
	return 0;
}

运用迭代的方法对于代码的实现

对于代码实现的目的是求第几个斐波那契数列,不是打印全部的数

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 z = Fib(n);
	printf("%d", z);
	return 0;
}

!!!这个是利用迭代的方法实现斐波那契数列第几个数的打印,整体思路比较简单,就是采取从前往后的方式来进行,关键一点在于可能对while里面的等式的理解,思路依旧是前两数相加等于后面的一个,相当于等式不断的向右来一点一点平移.

总结一个小套路:等式右边的永远相当于空,把右边的数赋给左边

拓展学习:

青蛙跳台阶问题

实际上就是斐波那契数列的问题递归, 问题解释,假设一只青蛙想要跳上为n的站台上,且每次只能跳一个或者俩个台阶,求最后跳上为n的站台一共有多少种不同的跳法.

其实问题的本事还是容易上手操作的,循序渐进,我们可以先看一下大体的一个思路,孰能生巧,将复杂的模型简单化.

 


总结

本次主要学习的是函数的递归和迭代,两者各有很好理解的例子,对于斐波那契数列的迭代我最好的理解方式就是等式的平移,最后还是有很多的数学模型值得我们去研究和挖掘.让我们一起去感受它们的魅力,好了,我们下期再见!!!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值