递归算法

1.何谓递归

递归算法是在函数或者子过程的内部,直接或间接的调用自己的算法;
简而言之:递归算法实际上是将问题转化为缩小了的同类问题的子问题,然后再递归调用函数或者过程来解决问题

2.使用递归的要点

1.递归是在过程或者函数中调用自身的过程
2.必须有一个明确的递归结束条件,称之为递归出口
3.递归算法虽然简洁,但是效率很低,容易栈溢出,除非特殊情况下不建议使用

3.实例1——斐波那契数列

3.1题目

指的是这样一个数列:01、1、2、3、5、8、13、21、34、… 要我们求第N个数是什么

3.2分析

由数列我们可以很容易的得出规律:f(n)=f(n-1)+f(n-2);
题目要求是我们要求f(n),要求f(n)得先求f(n-1)和f(n-2),要求f(n-1)又得求f(n-2)和f(n-3)…

很显然,我们将求f(n)转化为了求它的子问题f(n-1)、f(n-2)…,即将问题缩小转化为同类问题的子问题,这里满足了递归的第一个条件
第二个条件就是寻找递归出口,再次观察数列我们可以发现,当N<3时,f(n)就是1,因此这里就是递归出口,满足了第二个条件
在这里插入图片描述
在这里插入图片描述

4.实例2——求一个数的阶乘

4.1题目

随机输入一个数N,要求得到它的阶乘,!n= n x (n-1) x (n-2) x …2 x 1

4.2分析

1.分解为子问题:
比如这个数为6,!6=6x!5, !5=5*!4, !4=4*!3,!3=3*!2, !2=2*!1, !1=1,很显然子问题就是n*!(n-1)

2.寻找递归出口:
有上面分析看到,当N=1时,没有了子问题,再观察一下发现,当N=2时,它们的阶乘就是本身了,因此找到递归出口为当N<2时,返回本身,当前递归结束;
在这里插入图片描述

5.实例3——汉诺塔

5.1题目

汉诺塔(Tower of Hanoi),又称河内塔,是一个源于印度古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘

5.2分析

1.分解为子问题:
假设n个盘子,移动到C柱。那么移动第n个盘子需要先移动第n-1个,移动第n-1个需要先移动n-2个,此时我们将整个盘子看做两部分即第n个盘子和第n-1个;
这样就分解成了子问题:要想全部移动到C柱上面,先将n-1移动到B柱,再将第n个移动到C柱,再将第n-1个移动到C柱。

2.寻找递归出口:
我们不停的将盘子分解,那么当盘子个数为1时,即该盘子上面没有盘子了就可以直接进行移动
在这里插入图片描述

6.实例4——反转单链表

6.1题目

定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。

示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL

题目链接

6.2分析

1.分解为子问题:
假设链表长度为n,想要反转整个链表就需要先反转n和n-1个节点,再反转n-1和n-2个节点
这样整体链表的反转就被分解成了两个链表节点之间的反转
两个链表指点的反转方式为:head->next->next=head; head->next=NULL;

2.递归出口:
由于是从后向前开始反转,因此当我们得到最后一个节点的地址后,就返回最后一个节点的地址

在这里插入图片描述

7.实例5——对称二叉树

7.1题目

请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。
在这里插入图片描述

题目链接

7.2分析

1.分解为子问题:
判断是否是镜像二叉树,即判断对应的镜像节点是否相等
于是可以分解成两个对应节点之间的比较

2.递归出口:
当两个对应两个值不相等时或者两个节点有一个节点不为空一个节点为空时返回false

在这里插入图片描述

8.实例6——平衡二叉树

8.1题目

输入一棵二叉树的根节点,判断该树是不是平衡二叉树。如果某二叉树中任意节点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。
题目链接

8.2分析

在这里插入图片描述

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值