好的,让我首先说是这是家庭作业。但我有答案(玩它直到它工作)我的问题更多关于“如何”让老师多次解释(在线课程),但我只是没有得到它,希望有人在这里更擅长以我对他们的看法来解释事物。
这是作业:
编写一个函数recurPower(base, exp)
,通过递归调用自身来解决相同问题的较小版本,然后将结果乘以base**exp
来计算base
来解决初始问题。 / p>
此函数应该包含两个值 - base
可以是浮点数或整数; exp
将是≥0的整数。它应该返回一个数值。您的代码必须是递归的 - 不允许使用**
运算符或循环结构。
好的,经过几次尝试尝试和错误(我的意思是几个小时的更改事情)我想出了正确的代码,它解决了正确的答案,但我不明白如何。
以下是代码:
def recurPower(base, exp):
'''
base: int or float.
exp: int >= 0
returns: int or float, base^exp
'''
if exp <= 0:
return 1
return base * recurPower(base, exp - 1)
首先是exp = 0的部分然后返回是1 ....我不明白为什么会有任何回复1.第二是如果代码的最后部分,如果没有循环在哪里exp下降1?
答案 0 :(得分:5)
pow(2, 3)
= 2 * pow(2, 2)
= 2 * (2 * pow(2, 1))
= 2 * (2 * (2 * (pow 2, 0)))
= 2 * (2 * (2 * 1))) ; base case: n=0 -> return 1
= 2 * (2 * 2)
= 2 * 4
= 8
在每次递归中,您需要一个基本情况,即递归停止的条件,否则它永远不会结束。在乘法中,基本情况可能返回1,因为乘以1是中性的,即它不会影响先前的计算。
除了基本情况之外,你有一般情况你用“较小”的东西表达某些东西,这里:n ^ x = n * n ^(x-1),直到你在x时遇到基本情况= 0。
答案 1 :(得分:3)
第一个问题是为什么exp <= 0
会返回1.
根据定义,任何0作为指数的东西都是1.所以,
1^0 => 1
2^0 => 1
...
至于第二部分,这是递归工作。如果我拨打recurPower(2, 6)
,我会收到一系列看似
recurPower(2, 6) =>
2 * recurPower(2, 5) =>
2 * 2 * recurPower(2, 4) =>
...
2 * 2 * 2 * 2 * 2 * 2 * 1
这就是答案。
所以,在英语中,2 ^ 6与2 * 2 ^ 5完全相同。我们使用此规则将其分解为更简单和更简单的指数。