defmerge_sort(lst): # 从递归中返回长度为1的序列 if len(lst) <= 1: return lst
middle = len(lst) / 2 # 1.分解:通过不断递归,将原始序列拆分成 n 个小序列 left = merge_sort(lst[:middle]) right = merge_sort(lst[middle:]) # 进行排序与合并 return merge(left, right)
defmerge(left, right): i, j = 0, 0 result = [] # 2.解决:比较传入的两个子序列,对两个子序列进行排序 while i and j if left[i] <= right[j]: result.append(left[i]) i += 1 else: result.append(right[j]) j += 1 # 3.合并:将排好序的子序列合并 result.extend(left[i:]) result.extend(right[j:]) return result
对于一个形如
x op y
(
op
为运算符,
x
和
y
为数) 的算式而言,
它的结果组合取决于
x
和
y
的结果组合数
,而
x
和
y
又可以写成形如
x op y
的算式。
因此,该问题的子问题就是
x op y
中的
x
和
y
:
以运算符分隔的左右两侧算式解
。
然后我们来进行
分治算法三步走
:
res = [] for i, char in enumerate(input): if char in ['+', '-', '*']: # 1.分解:遇到运算符,计算左右两侧的结果集 # 2.解决:diffWaysToCompute 递归函数求出子问题的解 left = self.diffWaysToCompute(input[:i]) right = self.diffWaysToCompute(input[i+1