基本定义
递归算法:一种重复将问题转化为同类子问题来解决问题的方法。
简介:如何判断一个问题是否能用递归算法来解决, 该问题需要满足两个条件。
- 该问题能转化成同类子问题
- 子问题的转化能找到终止条件, 以使递归算法得到return。
经典的递归问题
- 汉诺塔问题
- 菲波那切数列
举例说明
以 LeetCode 上面第 60 题为例, 传送门
题目大意:给出 两个整数 n, k, 求出 1~n 的数字组成的所有排列中的第 k 个。
#coding=utf-8
# @brief: leetCode 60 题
# @author: BeyondShadow
# @date: 2018/01/23
import math
# @brief:n 的排列数个数是 n!, n 的排列数是 n*(n-1)!
# 可以先确定最高位, 然后问题就转化成了 n-1 个数, 第 _k 个元素
# 这样问题可拆分成子问题, 找到 _k 的表达式, 直到 _k == 1 为止
# 满足递归的两大条件
class Solution(object):
def getPermutation(self, n, k):
self.ret = ""
result = range(1, n+1)
self.recursion(n, k, result)
print self.ret
return self.ret
def recursion(self, n, k, result):
if k == 1:
for v in result:
self.ret = self.ret + str(v)
return
subLen = self.getSubLen(n-1)
head = int(math.ceil(1.0*k/subLen))
k = k-(subLen*(head-1))
head = result[head-1]
result.remove(head)
self.ret = self.ret+str(head)
self.recursion(n-1, k, result)
def getSubLen(self, n):
ans = 1
while(n>1):
ans *= n
n -= 1
return ans
s = Solution()
s.getPermutation(3, 2)
本文介绍了递归算法的基本概念,探讨了如何判断一个问题是适合使用递归算法解决,并通过LeetCode上的一个具体题目进行实例讲解。
1666

被折叠的 条评论
为什么被折叠?



