有没有更好的方法来编写此递归函数?

时间:2019-08-15 20:33:03

标签: python python-2.7 function

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

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

  {this.state.skuNumber.length === 6 && (
      <SKUViewNew
       skuNumber={this.state.skuNumber}
       products={products}
       productId={products.id}
       productName={products.name}
       imageId={products.imageUrl}
       listuom={products.uoms}
       fetchProducts={() => this.fetchProducts()}
       />
 )}

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

4 个答案:

答案 0 :(得分:4)

您可以在一行中完成它:

Option Explicit
Public Sub Test()

    Dim i As Long, wb As Workbook

    For i = 3 To Cells(Rows.Count, 1).End(xlUp).Row
        Set wb = Workbooks.Open(Cells(i, 1).Value)
        DoSomething wb
        wb.Close True
    Next i

End Sub

Private Sub DoSomething(ByVal wb As Workbook)
    'do stuff...
End Sub

通常,返回def is_power(a,b): return a == b or (a%b == 0 and is_power(a/b,b)) True是对比较的响应,而不仅仅是返回比较本身就比较冗长。比较已经是布尔值。

答案 1 :(得分:2)

也许更简洁一些:

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

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

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

答案 2 :(得分:0)

出于完整性考虑,您可以使用一种更高效(更冗长)的算法。

请注意,对于常数bis_pow(a,b)花费O(N^2)的时间,其中Na的比特大小。

您可以通过观察ab的幂来加快速度,然后ab的位长给出有关{{ 1}}分隔b,大小接近a。这样,每个递归调用都会将sqrt(a)的位大小大致减少一半。

a

答案 3 :(得分:-4)

我通常不做作业,但是因为知道一个人似乎知道我给了它什么。但这就是发生的事情,函数的参数是括号之间的变量,因此,当您键入该函数时,会将变量的值放在括号中,因此“ is_power(2,4)”会将2设置为变量a,并将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