【初识算法】递归

本文深入探讨了递归的概念,包括如何通过画图和函数栈帧理解递归,讨论了无限递归的可能性及其限制。接着,分析了递归时i++、++i和i++的区别,并给出了层次分析和深度分析的方法。最后,文章提供了几个递归练习,如整数反转、斐波那契数列、数组查找和二分查找,以巩固递归的理解和应用。
摘要由CSDN通过智能技术生成


递归在算法中是很重要的一个思想,任何高级算法的实现要想代码看起来简洁离不开递归,今天我们就来说说它。

一、理解递归

  1. 如何去理解递归思想:
  • 我们可以画图来理解它,将每一次的过程通过画图来展现,那么思想应该可以理解了。
  • 通过函数栈帧理解,可以通过它来看每个变量的变化,但是必须要明确每个栈帧的n不是同一个n,递归时我们不断地开辟栈帧,满足条件后,不断释放栈帧,进行回退。如下图:

在这里插入图片描述
2. 存在无穷递归吗?
我们知道递归和循环之间是可以替换的。代码中常常会遇到无限循环,在无限循环时不会造成其他进程运行,始终一个程序,所以不会开辟新栈帧。如while(1){}等,但是我们不会存在无限递归,原因时递归需要开辟栈帧,每一个电脑的栈大小是有限的,所以会存在栈溢出的风险,故不会存在无限递归。
3. 如何修改栈大小?
(1)linux下默认栈大小为10MB,修改栈大小:

ulimit -a #显示当前用户的栈大小
ulimit -s 32768 #将当前用户的栈大小设置为32M bytes

(2) Windows下栈大小为1MB,在windows平台下,栈的大小的信息是包含在可执行文件中的。它可以在Visual C++的编译过程中设置,但是在gcc中是不可行的。修改栈大小:

选择 “Project->Setting”.
选择 “Link”.
选择 "Category"中的 “Output”.
在 "Stack allocations"中的"Reserve:"中输栈的大小,例如: 32768

二、分析递归

在递归时我们会经常使用到i++ ,++i,i+1,我们分析以下有何不同,注意分析的时候,如果传入的参数不是引用,那么我们就进行层次分析但是代码是深度运行的,层次分析就是沿着代码走,不要去进入函数递归,比如一个节点,你考虑完左边就去考虑右边,不要左边递归左边,一直把左边考虑完,这个就变成深度分析了。是引用我们就深度分析。
我们以这一段代码来分析

  • i+1的情况
int fun(int i,int n)
{
   
	if(i>=n) 
	{
    
	     //cout<<i<<endl;
	     return i;
	}
	else
	{
   
		fun(i+1,n);
		//cout<<"fun1 "<<i<<endl;;
		fun(i
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值