zoukankan      html  css  js  c++  java
  • 递归和分治

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

    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)

  • 相关阅读:
    spring 学习-bean创建bean
    [转]spring 学习-bean创建-循环依赖-3
    [转]spring 学习-bean创建-循环依赖-2
    [转]spring 学习-bean创建-循环依赖-1
    2、python2.7,python3.9 ;在不同版本上获得整数类型运行的结果
    记一次Linux bash 命令行卡顿排查之警惕LD_PRELOAD环境变量
    CPU中断数查看与网卡中断绑核
    中华人民共和国 个人信息保护法 (全文学习)八章 七十四条 2021年11月1日起施行
    【模拟试题】旅行
    Vagrant出现的问题整理
  • 原文地址:https://www.cnblogs.com/wl413911/p/12938905.html
Copyright © 2011-2022 走看看