0

我刚开始学习编程,所以当我想在 python 中使用递归编写数字求和代码时。我遇到了这个问题,在这里我怎样才能将 add = 0 设为静态,有人可以帮忙,因为我的 ans 是 0

def sum(n):  
    add = 0
    if n > 0: 
        add = add + n
        sumf (n-1)
        print add

sum(10) 
4

9 回答 9

3

我想我明白你在问什么。您可以尝试在 python 中模拟这样的静态变量:

def test():
    test.static_variable += 1
    print test.static_variable

test.static_variable = 0
test()
于 2013-06-07T17:23:12.367 回答
2

您可以使用全局变量,但这通常是不好的做法。相反,把它写成一个类。这样,您可以将变量add与需要它的代码“捆绑”在一起。

class Sum(object):
    def __init__(self, add=0):
        self.add = add
    def __call__(self, n):
        if n > 0:
            self.add += n
            sumf(n-1)
            print self.add

sum = Sum()   # create an instance
sum(10)       # 10
sum(10)       # 20
于 2013-06-07T17:20:48.243 回答
2

如果我正确阅读了您的问题,那么您并没有真正解决这里的递归问题。你需要做这样的事情:

def sum(n):
    if n == 0:
        return n

    return n + sum(n - 1)

sum(n - 1)将返回(n - 1) + sum(n - 2),所以sum(n)最终返回n + (n - 1) + sum(n - 2)。它将继续扩展,直到nis 0,此时,您将获得从0到的所有数字的总和n

于 2013-06-07T17:22:15.123 回答
1

除了python没有静态变量之外,不要使用静态值进行递归,使用返回值。或者,如果您确实想在调用之间保持状态,请使用类。

于 2013-06-07T17:20:25.577 回答
0

可悲的是,在 Python 中,没有静态变量之类的东西。但是,您可以尝试通过add在函数范围之外进行定义来模拟这一点(在一定程度上)。此外,您的第 5 行显示为sumf (n-1); 这是故意的吗?

于 2013-06-07T17:17:49.393 回答
0

Python 实际上没有实用的静态变量。更多信息可在此处获得。Python 也不支持通过引用传递数字。

于 2013-06-07T17:19:39.040 回答
0

您可以将属性添加到函数并用于hasattr()初始化。

def func(n):  
    if not hasattr(func, "add"):
        func.add = 0

    func.add = func.add + n
    print func.add

func(10) # print 10
func(5)  # print 15
func(20) # print 35
于 2013-06-07T17:28:02.820 回答
0

这是递归执行此操作的正确方法:

def sum(n):
    if (n > 0):
        return n + sum(n-1)
    else:
        return 0
于 2013-06-07T17:28:44.113 回答
0

您正在尝试将静态变量用作累加器变量——就像有时在 C 中所做的那样。

如果你真的想做这样的事情,你可以在递归调用你的函数时传递累加器。并且该函数应返回累积值。

>>> def my_recursive_fct(n, acc = 0):
...     if n > 0:
...         acc = my_recursive_fct(n-1, acc)
...     return acc+n
... 
>>> my_recursive_fct(5)
15
>>> my_recursive_fct(0)
0

不确定这是最好的 Python 风格。至少在那种情况下;)

对于纯粹主义者,您可能希望重新排序指令以通过递归调用结束您的函数——但我认为这在 Python 中毫无意义,因为它不执行尾调用优化(或者我错了吗?)

于 2013-06-07T18:05:31.797 回答