3

好的,让我首先说是的,这是家庭作业。但是我有答案(一直玩到它起作用)我的问题更多是关于“如何”我让老师多次解释它(在线课程)但我就是不明白,希望这里的人更擅长用我对事物的看法来解释事物。

这是作业:

编写一个函数recurPower(base, exp),该函数base**exp通过递归调用自身来解决相同问题的较小版本,然后将结果乘以base解决初始问题。

这个函数应该有两个值——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 ?

4

2 回答 2

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 时达到基本情况。

于 2013-10-31T20:19:03.267 回答
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 完全相同。我们使用此规则将其分解为更简单和更简单的指数。

于 2013-10-31T20:16:48.760 回答