我刚刚开始学习编程,所以当我想在python中使用递归编写代码求和时。我遇到了这个问题,这里我怎么能把add = 0作为静态,有人可以帮忙,因为我的ans来了0
def sum(n):
add = 0
if n > 0:
add = add + n
sumf (n-1)
print add
sum(10)
答案 0 :(得分: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
答案 1 :(得分:2)
我想我明白你在问什么。您可以尝试在python中模拟这样的静态变量:
def test():
test.static_variable += 1
print test.static_variable
test.static_variable = 0
test()
答案 2 :(得分:1)
除了python没有静态变量这一事实外,不要使用静态值进行递归,请使用返回值。或者,如果您确实希望在调用之间保持状态,请使用类。
答案 3 :(得分:1)
如果我正确地阅读了你的问题,那么你并没有真正解决递归的问题。你需要做这样的事情:
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)
。它将继续扩展,直到n
为0
,此时,您拥有从0
到n
的所有数字的总和。
答案 4 :(得分:0)
可悲的是,在Python中,没有静态变量这样的东西。但是,您可以尝试通过在函数范围之外定义add
来模拟(在某种程度上)。另外,你的第5行是sumf (n-1)
;这是故意的吗?
答案 5 :(得分:0)
Python实际上没有实用的静态变量;有更多信息here。 Python也不支持通过引用传递数字。
答案 6 :(得分: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
答案 7 :(得分:0)
以下是递归执行此操作的正确方法:
def sum(n):
if (n > 0):
return n + sum(n-1)
else:
return 0
答案 8 :(得分: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中没有意义,因为它不执行tail call优化(或者我错了吗?)