递归,优雅的编程技巧

作为一名计算机专业的学生,我在大一的就接触到了递归,不过,只是了解定义,根本写不出易读优雅的递归代码。后来,随着代码量的增加,顿悟了一些技巧。现在,我想把自己的一点经验分享出来,希望能帮到初学者。

递归是个啥?

函数直接或者间接调用自身的编程技巧称为递归。它只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。

啥时候能用递归?

递归虽好,但不能滥用。当一个问题可以转化为若干个规模更小的同类问题,且父问题的解可轻易的根据若干个子问题的解得出时,大概率要召唤递归大杀四方了。

如何理解递归?

一般来说,递归需要有结束条件递进阶段回归阶段。当结束条件不满足时,程序执行递进阶段;当结束条件满足时,程序执行回归阶段

接下来,尝试用两个简单的例子,解析一下结束条件递进阶段回归阶段

第一个例子:讲故事

夜深了,小女孩要妈妈给她讲睡前故事,于是妈妈开始讲:

  • 从前庙里有两个和尚,小和尚想听故事,于是老和尚开始讲:
    • 从前庙里有两个和尚,小和尚想听故事,于是老和尚开始讲:
      • 从前庙里有两个和尚。。。

可以发现,故事里的老和尚其实是个秃头程序员,因为他讲了个递归故事:“讲故事”这个过程里面还在"讲故事”(函数直接或间接的调用自己)。
现在这个故事还是一个没有出口的循环,这怎么能行啊,小女孩还得睡觉鸭!
那么我们来设定一个结束条件:老和尚看了看表说:时间不早了,该睡觉了。 于是故事结束了。
某个故事里的两个和尚因为时间太晚睡觉了,故事就结束了,那讲这个故事的两个和尚呢?老和尚说:他们睡觉了,故事讲完了,咱们也该洗洗睡了。于是他们也睡觉了。
一层层的故事都讲完了,于是妈妈对小女孩说:他们都睡觉了,故事结束了,我们也睡吧。于是所有人的都睡了,所有的故事都结束了。
加上结束条件之后,妈妈讲的故事就变成了这样:

总结一下:

  • 讲故事就是递进阶段
  • 洗洗睡觉就是回归阶段
  • 时间太晚了就是结束条件

如果用伪代码描述一下的话,就是下面这个样子:

第二个例子:阶乘

上面的例子有点啰嗦,下面来个简洁的~
假设有个函数 f(x),返回值为 x 的阶乘。
阶乘想必大家都很熟悉了:

  • 当 x <= 1 时,f(x) 返回 1。
  • 当 x > 1 时,f(x) 返回 x*f(x-1)。

这个 f(x) 调用了 f(x-1),显然这是个递归的函数。以计算 f(6) 为例:

用代码实现一下:

总结一下:

  • f(x) 调用 f(x-1) 就是递进阶段
  • x <= 1 时,f(x) 无需调用 f(x-1),就是结束条件
  • f(x) 利用 f(x-1) 的返回值计算自身的结果,就是回归阶段
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值