我刚开始学习编程,所以当我想在 python 中使用递归编写数字求和代码时。我遇到了这个问题,在这里我怎样才能将 add = 0 设为静态,有人可以帮忙,因为我的 ans 是 0
def sum(n):
add = 0
if n > 0:
add = add + n
sumf (n-1)
print add
sum(10)
我刚开始学习编程,所以当我想在 python 中使用递归编写数字求和代码时。我遇到了这个问题,在这里我怎样才能将 add = 0 设为静态,有人可以帮忙,因为我的 ans 是 0
def sum(n):
add = 0
if n > 0:
add = add + n
sumf (n-1)
print add
sum(10)
我想我明白你在问什么。您可以尝试在 python 中模拟这样的静态变量:
def test():
test.static_variable += 1
print test.static_variable
test.static_variable = 0
test()
您可以使用全局变量,但这通常是不好的做法。相反,把它写成一个类。这样,您可以将变量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
如果我正确阅读了您的问题,那么您并没有真正解决这里的递归问题。你需要做这样的事情:
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
is 0
,此时,您将获得从0
到的所有数字的总和n
。
除了python没有静态变量之外,不要使用静态值进行递归,使用返回值。或者,如果您确实想在调用之间保持状态,请使用类。
可悲的是,在 Python 中,没有静态变量之类的东西。但是,您可以尝试通过add
在函数范围之外进行定义来模拟这一点(在一定程度上)。此外,您的第 5 行显示为sumf (n-1)
; 这是故意的吗?
Python 实际上没有实用的静态变量。更多信息可在此处获得。Python 也不支持通过引用传递数字。
您可以将属性添加到函数并用于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
这是递归执行此操作的正确方法:
def sum(n):
if (n > 0):
return n + sum(n-1)
else:
return 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 中毫无意义,因为它不执行尾调用优化(或者我错了吗?)