【问题标题】:Return value of if/else recursive function incorrect but print value correctif/else 递归函数的返回值不正确但打印值正确
【发布时间】:2015-03-24 07:50:42
【问题描述】:

尝试使用递归来求解黎曼和。

def f(x):
    import math
    return 10*math.e**(math.log(0.5)/5.27 * x)

liTotal = 0
def radExpo(start, stop, step):
    global liTotal
    x = start
    area = f(x)*step
    liTotal += area
    numOfRects = (stop - start) / step
    if start > (stop - (2 *step)):
        return liTotal
    else:
        return radExpo((start+step), stop, step)

radExpo(12, 16, 1)

如果我将 if return 语句更改为

print liTotal

或者如果我用

调用函数
print radExpo

它可以正常工作,但是如果我定期调用/返回它,它会返回错误的值,所以我不能使用返回的值。

【问题讨论】:

  • 你实际上不需要 else
  • else不是递归回调函数吗?
  • 每次通话只能返回一个或另一个,不能同时返回
  • 我两个都不想要。我只希望 if 在满足条件时返回值 liTotal。
  • 别担心你不会得到这两个,这是我的意思。

标签: python if-statement recursion return


【解决方案1】:

如果这是关于代码有什么问题的问题,我会重构代码以删除全局引用,这将提高其可靠性。如果print liTotalprint radExpo(12,16,1) 不同,我无法重现您的问题

删除全局变量引用的代码修改版本如下所示:

def f(x):
    import math
    return 10*math.e**(math.log(0.5)/5.27 * x)

def radExpoNew(start, stop, step):
    x = start
    area = f(x)*step
    if start <= (stop - (2 *step)):
        area += radExpoNew((start+step), stop, step)
    return area

print radExpoNew(12,16,1)  # prints 6.84864583554

【讨论】:

  • 哇!我什至没有真正考虑根据开始条件将递归添加到区域。
【解决方案2】:

一些简化:

from math import e, log

# rule #1:
# e ** (a*b) == (e ** a) ** b

# applying rule #1 twice:
# e ** (log(0.5) / 5.27 * x) == ((e ** log(0.5)) ** (1/5.27)) ** x

# rule #2:
# e ** log(k) == k

# applying rule #2:
# e ** log(0.5) == 0.5
# 0.5 ** (1/5.27) == 0.8767556206241964

# so we get:
def fn(x):
    return 10 * 0.8767556206241964 ** x

那么radExpo本质上就是在做尾递归(在函数结束时调用自己一次),所以我们可以非递归地重写它:

def integrate(fn, start, stop, step):
    steps = int((stop - start) / step)
    return sum(
        fn(start + k*step)     # calculate x directly for each step
        for k in range(steps)  #   to prevent error accumulation
    ) * step

这消除了导致问题的全局变量(因为您在再次调用该函数之前没有重置它)。

然后

>>> integrate(fn, 12, 16, 1)
6.848645835538626

作为奖励,您可以集成您喜欢的任何功能:

>>> from math import pi, sin
>>> integrate(sin, 0, pi, 0.001)
1.999999361387437    # pretty darn close to 2.0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-29
    • 2013-03-17
    • 2018-09-21
    • 2012-10-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多