我写了一个小的递归函数,用来测试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()}
/>
)}
有没有更简洁的方式可以编写此函数?另外,让函数以这种方式返回自身是否合适?到目前为止,我所看到的递归函数似乎并没有返回自己,而是只是调用自己并返回其他东西。谢谢
答案 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)
出于完整性考虑,您可以使用一种更高效(更冗长)的算法。
请注意,对于常数b
,is_pow(a,b)
花费O(N^2)
的时间,其中N
是a
的比特大小。
您可以通过观察a
是b
的幂来加快速度,然后a
和b
的位长给出有关{{ 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