【问题标题】:Is there a better way to write this recursive function?有没有更好的方法来编写这个递归函数?
【发布时间】:2019-08-16 05:02:12
【问题描述】:

我写了一个小递归函数,用来测试 a 是否是 b 的幂。 Think Python 的完整练习是:

一个数 a 是 b 的幂,如果它可以被 b 整除,并且 a/b 是 b 的幂。编写一个名为 is_power 的函数,它接受参数 a 和 b,如果 a 是 b 的幂,则返回 True。注意:您必须考虑基本情况。

def is_power(a, b):
    if a == b:
        return True
    elif a % b == 0:
        a = a/b
        return is_power(a, b)
    else:
        return False

有没有更简洁的方式来编写这个函数?另外,让函数以这种方式返回自己是否合适?到目前为止我所看到的递归函数似乎并没有返回自己,而是他们只是调用自己并返回其他东西。谢谢

【问题讨论】:

  • 该函数不是“返回自身”——它返回的是“评估自身的结果”——当然,这正是递归的含义! (当然,在不同的论点上,否则递归将永远不会结束。)
  • 基本情况可能更基本:如果a == b,您仍然可以将a 除以b 得到1,从而递归调用is_power(1, b)。 (除 0 的 0 次方之外的任何值都是 1。)

标签: python python-2.7 function


【解决方案1】:

你可以在一行中完成:

def is_power(a,b):
    return a == b or (a%b == 0 and is_power(a/b,b))

一般来说,返回TrueFalse 是对比较的响应,而不是仅仅返回比较本身。比较已经是布尔值。

【讨论】:

    【解决方案2】:

    也许更简洁一点:

    def is_power(a, b):
        if a % b != 0:
            return False
        return a == b or is_power(a/b, b)
    

    至于本例中的“返回自身的递归函数”,这是一个很好的结构,它被称为“尾递归”。

    它之所以好的原因是因为一些编译器知道如何进行尾递归优化,这使您的代码运行得更快,并且比“正常”递归消耗更少的内存。

    【讨论】:

      【解决方案3】:

      为了完整起见,您可以使用更高效(也更详细)的算法。

      请注意,对于常量 bis_pow(a,b) 需要 O(N^2) 时间,其中 Na 的位大小。

      您可以通过观察如果ab 的幂,那么ab 的位大小给出了关于b 的幂的信息,它除以a 并且是大小接近sqrt(a)。这样,每次递归调用都会将a 的位大小减少大约一半。

      def is_power(a, b):
          if a == b:
              return True
          elif a % b != 0:
              return False
          n = a.bit_length()
          m = b.bit_length()
          x = pow(b, n//m)
          return is_power(a//x, b)
      
      
      def is_power_quadratic(a, b):
          if a % b != 0:
              return False
          return a == b or is_power_quadratic(a//b, b)
      
      # In [26]: %timeit is_power_quadratic(2**(10**3), 2)                             
      # 597 µs ± 3.58 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
      
      # In [27]: %timeit is_power(2**(10**3), 2)                                 
      # 10 µs ± 26.4 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
      

      【讨论】:

        【解决方案4】:

        我通常不做作业,但因为知道一个人似乎知道它是什么,所以我给了它。但这是发生的事情,函数的参数几乎是括号之间的变量,所以当你键入函数时,你会将变量的值放在括号中,所以“is_power(2, 4)”会将变量 a 设置为 2,并将 4 设置为变量 b。现在 Return 只是将结果发送回会话。确保 True 和 False 大写,否则会认为它们是变量。但是如果你像这样运行这个程序,“is_power(2, 4)”,执行后它会在屏幕上打印 True,因为 2 的幂是 4。

        def is_power(a, b):
            power = pow(a)
            if power == b:
                return True
            else:
                return False
        

        【讨论】:

        • 这里有几个问题:首先,问题是a是否是b的幂,您的描述似乎表明相反。此外,python 中的pow() 函数至少需要两个参数;你只展示了 1。第三,这是一个递归练习,但你的答案不使用递归。随意尝试纠正它!
        猜你喜欢
        • 2020-03-16
        • 2021-09-20
        • 1970-01-01
        • 1970-01-01
        • 2014-11-24
        • 1970-01-01
        • 1970-01-01
        • 2013-08-18
        • 1970-01-01
        相关资源
        最近更新 更多