递归算法

“递归”过程就是指函数调用自身的过程。
递归实现的条件有两个1.趋近于某个临界值;2.循环调用自己本身。
优点是代码简单,代码量少;
缺点是耗内存,耗资源,不易理解,不易理解,不易理解(重要事情说三遍!!)
递归的设计通常包含两部分:
1.递归的定义:将大问题转化为小问题求解。
  递归定义就是对问题分解,将一个问题分解为规模较小的问题并用相同的程序去解决。
2.递归的终止条件:跳出递归,返回最小问题的解。
  递归终止条件通常就是得出最小问题的解,并返回给他的调用者。
所有的递归程序都具有一下特点:
这些方法使用if-else或switch语句来引导不同的情况
一个或多个基础情况(最简单的情况)用来终止递归。
每次递归都会简化原始问题,让它不断接近基础情况,知道它变成基础情况(最小问题)为止。
比如我们知道一号同学今年18岁,二号比一号大两岁,三号又比二号大两岁。。。。。。反过来看,我们要想知道六号同学年龄,就要知道五号同学年龄,想知道五号年龄,又要知道四号年龄。。。这样就是简化问题的过程。递归的难点就是不易理解,需要有清晰的思路。下面我们通过画图理解程序
这里在这里插入图片描述
这里用的for循环方法,下面用递归实现:
在这里插入图片描述
通过这个例子 我们可以了解递归算法:无限调用自身这个函数,每次调用总会改动一个关键变量,直到这个关键变量达到边界的时候,不再调用。
下面在用两种方法做阶乘问题:
在这里插入图片描述
画图表示就是这样,更有助于理解
在这里插入图片描述
上面两道例题,我分别用了for循环的递归的方法,那他们俩有神马相同和不同点呢?
相同点:
(1)都是通过控制一个变量的边界(或者多个),来改变多个变量为了得到所需要的值,而反复而执行的;
(2)都是按照预先设计好的推断实现某一个值求取;(请注意,在这里循环要更注重过程,而递归偏结果一点)
不同点:
(1)递归通常是逆向思维居多,“递”和“归”不一定容易发现(比较难以理解);而循环从开始条件到结束条件,包括中间循环变量,都需要表达出来(比较简洁明了)。
简单的来说就是:用循环能实现的,递归一般可以实现,但是能用递归实现的,循环不一定能。因为有些题目①只注重循环的结束条件和循环过程,而往往这个结束条件不易表达(也就是说用循环并不好写);②只注重循环的次数而不注重循环的开始条件和结束条件(这个循环更加无从下手了)。但是,对一些计算比较复杂的问题,递归是调用很多次函数。**比如接下来的汉诺塔要运行无数年才有结果而循环数组保存数据很多。所以呢,斐波那契函数用for循环写比较好,原因一个字:快!!!
上面提了汉诺塔问题如图,汉诺塔问题是指有三根杆子A,B,C。C杆上有若干碟子,把所有碟子从A杆上移到C杆上,每次只能移动一个碟子,大的碟子不能叠在小的碟子上面。求最少要移动多少次? 思路如图
在这里插入图片描述
有了思路,程序就很好写了:
在这里插入图片描述
下面我们用递归重写一下斐波那契数列:
在这里插入图片描述
程序编写过程中我把循环嵌套搞忘了 编译出错
正确的形式:if(表达式1) 语句1
else if(表达式2) 语句2
else if(表达式m) 语句m
else 语句m+1
二分查找用递归实现:
在这里插入图片描述
程序结果
在这里插入图片描述
简单总结一下:
一个递归调用可以导致更多的递归调用,因为这个方法继续个把每个【子问题】分解成新的子问题,要终止一个递归方法,问题最后必须达到一终止条件。当问题达到这个【终止条件】时,就将结果返回给调用者。然后调用者进行计算并将结果反悔给自己的调用者。这个过程持续进行,知道结果传给原始的调用者位为止。
错误之处,欢迎指正!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值