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)

  • 相关阅读:
    电路原理图基本知识概述(转)
    数字电路笔记
    模拟电路笔记
    ROS笔记一
    STM32笔记三
    电子元件笔记
    STM32笔记二
    C语言相关知识
    利用sql报错帮助进行sql注入
    kali下纯文本与窗口环境切换
  • 原文地址:https://www.cnblogs.com/wl413911/p/12938905.html
Copyright © 2011-2022 走看看