python递归函数例题_递归讲解及其python实现例题(leetcode)

递归

递归是一种自己调用自己的编程方式,递归的一个最大的特点是: 将大型复杂的问题转化为较小的与原始问题类似的问题。递归的代码设计简单明了。

它包含的三个条件是: 1. 边界条件,2. 递归前进段, 3. 递归返回段

设计递归程序一般包含下面两个: 1.设计递归式, 2. 给定终止条件

我们将使用leetcode中的例题进行记录学习

二叉树的最大深度

我们知道二叉树只包含左右孩子两个节点,并且节点的数值可以为空,那么一个根节点开始的二叉树,去掉根节点后可以看作两个二叉树,依次类推,那么最后一个节点处可以看作左右孩子节点是空的。因此递归终止条件是节点是否为空,如果为空,返回0(说明这是最后子节点,深度为0),否则进入设计递归式,由于存在左右两个节点的方向,因此最大深度就是

math?formula=max(l_%7Btree%7D%2C%20r_%7Btree%7D),既然在此处节点可以向两边走去说明递归返回段是

math?formula=max(l_%7Btree%7D%2C%20r_%7Btree%7D)%20%2B%201 ,在前进段中,分别向左子节点和右子节点进行搜索。因此

代码如下:

# Definition for a binary tree node.

# class TreeNode:

# def __init__(self, x):

# self.val = x

# self.left = None

# self.right = None

class Solution:

def maxDepth(self, root: TreeNode) -> int:

if root is None:

return 0

else:

l_tree = self.maxDepth(root.left)

r_tree = self.maxDepth(root.right)

return max(l_tree, r_tree) + 1

爬楼梯问题

爬楼梯问题也是典型的递归解决的问题,通过题目我们反向推断:到达最后一层(

math?formula=n)层,要么是

math?formula=n-1层过来的,要么是

math?formula=n-2层过来的,那么对于

math?formula=n-1层来说也是同理于

math?formula=n层。因此可以使用递归进行计算。递归边界条件就是当n=1时,需要一种,n=2时,需要2种走法,递归的前进条件就是不断递归式求解

math?formula=f(n)%20%3D%20f(n-1)%20%2B%20f(n-2)

递归代码如下:

class Solution:

def n_stairs(self, n):

if n == 1:

return 1

elif n == 2:

return 2

return self.n_stairs(n-1) + self.n_stairs(n-2)

def climbStairs(self, n: int) -> int:

if n == 1:

return 1

if n == 2:

return 2

return self.n_stairs(n-1) + self.n_stairs(n-2)

但是一个最大问题是:这里的递归求解会占用较大内存和时间,因此改写成循环方式实现。

迭代代码如下:

class Solution:

def climbStairs(self, n: int) -> int:

if n == 1:

return 1

temp_list = [0] * n

temp_list[0] = 1

temp_list[1] = 2

for i in range(2,n):

temp_list[i] = temp_list[i-1] + temp_list[i-2]

return temp_list[n-1]

这个过程中不断地保存每次结果,直到到达求解的第

math?formula=n个数据。

递归乘法

2020/8/15

题目: 输入两个数

math?formula=A

math?formula=B,在不使用

math?formula=*的情况下,计算它们的乘积,可以使用加、减、移位运算。问题描述的很清楚,比如输入

math?formula=A%3D3,

math?formula=B%3D4时,除了使用

math?formula=3*4%3D12外,我们最能想到的做法是

math?formula=4%2B4%2B4%3D12。这里使用递归的思路很容易理解,

math?formula=n个4相加的过程,本质上就是每一步+4。这样就能够获得一个式子

math?formula=multiply(A%2C%20B)%20%3D%20multiply(A-1%2C%20B)%20%2B%20B。接下来我们看看递归边界,当

math?formula=A%3D0时,乘积为0,自然返回0。当

math?formula=A%3D1时,那么返回B。

Notes:

这里最重要的一点是,math?formula=A一定要是

math?formula=A

math?formula=B两个数中最小的那个,不然不断地递归操作会使得内存耗尽。

递归代码如下:

class Solution:

def multiply(self, A: int, B: int) -> int:

## 注意将加次项设置为最小的,这个执行的递归的深度

if A > B:

A, B = B, A

if A == 0:

return 0

elif A == 1:

return B

return self.multiply(A-1, B) + B

二叉树的中序遍历

2020/8/15

给定一个二叉树,返回其中序遍历。

二叉树的中序遍历: 考察到一个节点后,将其暂存,遍历完左子树后,再输出该节点的值,然后遍历右子树。根据概念,我们使用递归,并且这个过程中存储对应的values数值。

Notes:

注意的一点是,由于达到叶子节点,没有返回的内容,因此要使用全局的

math?formula=list保存对应节点的数据,这样的话,必须借助一个

math?formula=helper函数。

递归代码如下:

# Definition for a binary tree node.

# class TreeNode:

# def __init__(self, x):

# self.val = x

# self.left = None

# self.right = None

### 二叉树的中序遍历: 考察到一个节点后,将其暂存,遍历完左子树后,再输出该节点的值,然后遍历右子树

class Solution:

def helper(self, root, a_list):

if root is not None:

self.helper(root.left, a_list)

a_list.append(root.val)

self.helper(root.right, a_list)

def inorderTraversal(self, root: TreeNode) -> List[int]:

temp_list = []

self.helper(root, temp_list)

return temp_listB

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值