wl413911

递归和分治

一、递归和分治基本的模式(代码)

1、递归

def recursion(self,level,param1,param2,...):

  # 递归终止条件(base case)

  if level > MAX_LEVEL:

    print result

    return

 

  # 处理当前level需要处理的逻辑

  process_data(level,data,...)

 

  # 递归到下一个level

  self.recursion(level+1,new_param1,new_param2,...)

 

  # 返回当前level的状态(视情况,可能需要,可能不需要)

 

 

2、分治 (divide and conquer):将一个大问题分解问若干个容易处理的小问题,分别解决

class Solution(object):

  # 分治,一般都有一个待处理的问题----problem

  def divide_conquer(self,problem,param1,param2,...):

    # 终止条件

    if problem == None:

      print_result

      return

  

    # 准备数据,将problem切分为子问题

    data = prepare_data()

    subProblems = split_problem(problem,data)

    

    # 分别的处理子问题

    subResult1 = self.divide_conquer(subProblem1,new_param1,...)

    subResult2 = self.divide_conquer(subProblem2,new_param1,...) 

    ......

 

    # 处理 并 生成最终的结果

    result = process_result(subResult1,subResult2,...)

二、举例

 

1、求pow(x,n) ,x的n次方。

暴力循环:

class Solution(object):

  def pow(self,x,n):

    if n==0:

      return 1

    if n<0:

      x = 1/x

      n = -n

    pow = 1

      while n:

      pow *= x

    return x

时间复杂度:O(n)

空间复杂度:O(1)

分治加递归:

class Solution(object):

  def pow(self,x,n):

    #终止条件,如果n为0,则返回1

    if not n:

      return 1

    # 如果n为负数,则计算倒数,并将n变为正数

    if n < 0:

      return 1/pow(x,-n)

 

    # n为奇数,则增加一次递归

    if n % 2:

      return x*self.pow(x,n-1)

 

    # n为偶数,则分解为两个相等的子问题,计算(x**(n/2)) * (x**(n/2))

    return self.pow(x*x,n/2)

时间复杂度:O(logn)

空间复杂度:O(logn)

循环:

class Solution(object):

  def pow(self,x,n):

    if x == 0:

      return 0

    if n<0:

      x = 1/x

      n = -n

    pow = 1

    while n:

      # n为奇数的情况

      if n & 1:

        pow *= x

      # n为偶数,x加倍,n减半

      x*=x

      n >>1

    return pow

时间复杂度:O(logn)

空间复杂度:O(1)

 

posted on 2020-05-22 18:24  wl413911  阅读(173)  评论(0编辑  收藏  举报