python递归实现_递归算法(python实现)

2ff34e647e2e3cdfd8dca593e17d9b0a.png

在函数的定义中对这个函数自身的调用,就是递归。

递归结构中,递归的部分必须比原来的整体简单,才有可能到达某种终结点(出口)。而且必须存在非递归的基本结构构成的部分,否则会无限递归。

学习目标:编程实现斐波那契数列求值 f(n)=f(n-1)+f(n-2)

编程实现求阶乘 n!

编程实现一组数据集合的全排列LeetCode 46. 全排列

LeetCode 47. 全排列 II

LeetCode 70. 爬楼梯

以上问题都可以用递归来解决。

斐波那契数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。

[0,1,1,2,3,5,8,13,...] 给定n,计算 f(N)

方法1

2

3

4

5class :

def fib(self, N: int) -> int:

if N <= 1:

return N

return self.fib(N-1) + self.fib(N-2)

动态规划方法参见:动态规划

求阶乘 n!1

2

3

4

5

6

7

8def factorial(n):

if n == 0 or n == 1:

return 1

else:

return (n*factorial(n-1))

a = factorial(3)

print(a)

输出:6

LeetCode 46. 全排列

给定一个没有重复数字的序列,返回其所有可能的全排列。

示例输入: [1,2,3]输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1]]

方法

每次选择一个数出来,然后把剩下的数,再选择一个出来,依次类推,选到头,就回溯到上一层。1

2

3

4

5

6

7

8

9

10

11class :

def permute(self, nums: List[int]) -> List[List[int]]:

res = []

def dfs(nums = nums, path = []):

if not nums:

res.append(path)

for i in range(len(nums)):

dfs(nums[:i]+nums[i+1:], path+[nums[i]])

dfs()

return res

LeetCode 47. 全排列 II

给定一个可包含重复数字的序列,返回所有不重复的全排列。

示例:输入: [1,1,2]输出: [ [1, 1, 2], [1, 2, 1], [2, 1, 1] ]

方法

相比上一题,多了排序和内部的重复判断。1

2

3

4

5

6

7

8

9

10

11

12

13

14class :

def permuteUnique(self, nums: List[int]) -> List[List[int]]:

nums.sort()

res = []

def dfs(nums = nums, path=[]):

if not nums:

res.append(path)

for i in range(len(nums)):

if i>0 and nums[i] == nums[i-1]:

continue

dfs(nums[:i]+nums[i+1:], path+[nums[i]])

dfs()

return res

LeetCode 70. 爬楼梯

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。

每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

注意:给定 n 是一个正整数。

示例 :1

2

3

4

5

6输入: 3

输出: 3

解释: 有三种方法可以爬到楼顶。

1. 1 阶 + 1 阶 + 1 阶

2. 1 阶 + 2 阶

3. 2 阶 + 1 阶

方法:递归

当有n个台阶时,可供选择的走法可以分两类:1,先跨一阶再跨完剩下n-1阶;2,先跨2阶再跨完剩下n-2阶。所以n阶的不同走法的数目是n-1阶和n-2阶的走法数的和。 这和斐波那契数列的规律相同,可以用这个思路。1

2

3

4

5

6

7

8

9class :

def climbStairs(self, n):

"""

:type n: int

:rtype: int

"""

if n<=2:

return n

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

这个方法运行正常,但是因为超出时间限制,未能通过。

方法:动态规划

动态规划来记录历史数据。1

2

3

4

5

6

7

8

9

10class :

def climbStairs(self, n):

"""

:type n: int

:rtype: int

"""

prev, current = 0, 1

for i in range(n):

prev, current = current, prev + current

return current

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值