** recurPower **我明白了,但我不明白

时间:2013-10-31 20:14:00

标签: python recursion exp

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

这是作业:

编写一个函数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?

2 个答案:

答案 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完全相同。我们使用此规则将其分解为更简单和更简单的指数。