想学py的小白 发表于 2023-3-25 11:52:10

迭代和递归:分别用迭代(iterPower(base, exp)) 和递归(recurPower(base, exp)) 方...

想请问递归代码是否正确?看了好多关于迭代和递归区别的文章,但感觉反应在代码上还是不太能理解。

迭代代码:
def iterPower(base,exp):
    result=1.0
    while exp>0:
      result*=base
      exp-=1
    return result
print(iterPower(2, 5))

递归代码
def recurPowerNew(base, exp):
    if exp == 0:
      return 1
    else:
      return base**exp
print(recurPowerNew(2,5))

isdkz 发表于 2023-3-25 12:02:59

你给出的迭代代码是正确的,而递归代码没有正确地实现递归。

你的递归代码是直接计算 base 的 exp 次方,而不是使用递归的方式。

递归版本的代码应该如下所示:

def recurPower(base, exp):
    if exp == 0:
      return 1
    else:
      return base * recurPower(base, exp - 1)

print(recurPower(2, 5))

在这个递归版本中,我们在每次递归调用中将指数减少1,直到指数为0时递归终止。

递归实际上是将问题分解为更小的子问题,然后将子问题的解决方案组合起来以解决原始问题。

在这个例子中,子问题是计算 base 的 exp-1 次方,然后将结果乘以 base 以得到 base 的 exp 次方。

ouyunfu 发表于 2023-3-25 16:30:29

你的递归代码是可以工作的,但它并没有真正体现出递归的特性,因为它只是用了指数运算符(**)来计算结果。一个更能展示递归思想的例子是,利用递归来实现指数幂的计算。

下面是一个递归计算幂的例子:def recurPower(base, exp):
    if exp == 0:
      return 1
    elif exp % 2 == 0:
      return recurPower(base*base, exp/2)
    else:
      return base * recurPower(base, exp-1)

这个函数接受一个底数(base)和指数(exp),并返回base的exp次幂。如果指数为0,那么返回1。如果指数是偶数,那么递归调用recurPower(base*base, exp/2),这相当于将指数除以2,底数变成原来的平方,以此类推。如果指数是奇数,那么返回base * recurPower(base, exp-1),这相当于将指数减1,递归计算base的(exp-1)次幂,再将结果乘以base。

使用这个递归函数来计算2的5次幂的代码如下:
print(recurPower(2, 5))

这将输出32,这是正确的答案。

需要注意的是,递归代码必须满足两个条件:递归基础条件(base case)和递归条件(recursive case)。在这个例子中,基础条件是当指数为0时,结果为1。递归条件是当指数为偶数时,递归调用recurPower(base*base, exp/2),否则递归调用base * recurPower(base, exp-1)。基础条件保证了递归结束,而递归条件则递归地计算幂。

match123_xbd 发表于 2023-3-29 08:24:31

{:7_141:}
页: [1]
查看完整版本: 迭代和递归:分别用迭代(iterPower(base, exp)) 和递归(recurPower(base, exp)) 方...