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)

  • 相关阅读:
    [搬运] Tina R329 swupdate OTA 步骤
    摄像头 ISP 调试的经验之谈(以全志 AW hawkview 为例)
    2021 年了 在 WSL2 中使用 adb 、fastboot 的等命令
    wsl2 编译 linux openwrt 项目的时候,经常会出现 bash: -c: line 0: syntax error near unexpected token `('
    sipeed v833 硬件验证以及开发记录(2021年5月18日)
    Allwinner & Arm 中国 & Sipeed 开源硬件 R329 SDK 上手编译与烧录!
    把 R329 改到 ext4 sdcard 启动变成 Read-Only 系统,导致没有文件修改权限后如何修复。
    linux kernel version magic 不一致导致的模块 加载 (insmod) 不上
    剑指 Offer 17. 打印从1到最大的n位数
    剑指 Offer 16. 数值的整数次方
  • 原文地址:https://www.cnblogs.com/wl413911/p/12938905.html
Copyright © 2011-2022 走看看