• 递归和分治


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

    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)

  • 相关阅读:
    January 25th, 2018 Week 04th Thursday
    January 24th, 2018 Week 04th Wednesday
    January 23rd, 2018 Week 04th Tuesday
    January 22nd, 2018 Week 04th Monday
    January 21st, 2018 Week 3rd Sunday
    January 20th, 2018 Week 3rd Saturday
    January 19th, 2018 Week 3rd Friday
    January 18th, 2018 Week 03rd Thursday
    January 17th, 2018 Week 03rd Wednesday
    January 16th, 2018 Week 03rd Tuesday
  • 原文地址:https://www.cnblogs.com/wl413911/p/12938905.html
Copyright © 2020-2023  润新知