我正在复习一些好的旧算法,并使用python来完成,因为我现在更经常使用它。
我在运行递归函数时遇到了一个问题;当递归函数每次调用自己时,变量都会重置:
def recursive_me(mystring):
chars = len(mystring)
if chars is 0:
print("Done")
else:
first = int(str[0])
total = + first
print(total)
recursive_me(mystring[1:])
recursive_me("4567")
我在这里要做的是得到一个由数字组成的字符串;取第一个,将其转换为int;然后递归地再次运行该函数,这样我就可以一次从字符串中取一个数字,并对所有值求和。
理想情况下,输出应该显示总数,同时将所有数字相加(4+5+6+7),尽管当第一次调用递归函数时,函数会重置总值。
使用递归函数运行操作时使用全局变量的常见习惯是什么?还是我做错了什么?
您可以这样简单地编写代码:
或者
尽管这在Python中没有多大帮助,因为它没有实现尾部调用优化。
如果要查看中间值,请更改第二个版本,如下所示:
那么
前言:在我写这个答案的同时,很多答案都得到了有意义的编辑。别跟我作对。
我把我的两分钱投在这里只是因为有很多过于复杂的答案。 这是一个正确的复制粘贴操作的努力。
首先,如果字符串中没有左字符,我们检查基本情况。如果字符串长度为0,则返回计算的总弹药量。
否则,我们将第一个字符转换为int,并将其添加到total中。第一个错误是您编写了
str[0]
。str
是一个python内置类型,产生的错误类似于“str不可订阅”。此错误表示“[]运算符无法对
str
进行操作。如果你试着做1[0]
同样的事情,因为1
是一个整数。“[%”运算符只能对列表、元组和字符串进行操作(我可能忘记了一些内置类型)。第二个错误是添加部分。你已经写了
total = + first
,但是你要找的运算符是+=
,实际上这只是写a = a+b
的一种简化方法。另外,您最初的问题是关于“python”忘记了“total”的值。这是因为您要么向前传递该值,要么以一种“强制”它的方式编写递归函数,即所谓的,当场计算下一次对函数的调用。
在我的示例中,我将发送递归函数的下一个调用,即当前的总值。在上面@uselpa;给出的示例中,他让python通过将函数放在运算符
+
之后来计算对该函数的下一次调用:这就变成了(对于
recursive_me("4567")
)因为python需要在这里返回一个值,但是表达式一直在调用新函数,而python在将所有函数求值为一个最终数字(在本例中至少是这样)之前无法返回。
前言:在我写这个答案的同时,很多答案都得到了有意义的编辑。别跟我作对。
我把我的两分钱投在这里只是因为有很多过于复杂的答案。 这是一个正确的复制粘贴操作的努力。
首先,如果字符串中没有左字符,我们检查基本情况。如果字符串长度为0,则返回计算的总弹药量。
否则,我们将第一个字符转换为int,并将其添加到total中。第一个错误是您编写了
str[0]
。str
是一个python内置类型,产生的错误类似于“str不可订阅”。此错误表示“[]运算符无法对
str
进行操作。如果你试着做1[0]
同样的事情,因为1
是一个整数。“[%”运算符只能对列表、元组和字符串进行操作(我可能忘记了一些内置类型)。第二个错误是添加部分。你已经写了
total = + first
,但是你要找的运算符是+=
,实际上这只是写a = a+b
的一种简化方法。另外,您最初的问题是关于“python”忘记了“total”的值。这是因为您要么向前传递该值,要么以“强制”它的方式编写递归函数,即所谓的,当场计算下一次对函数的调用。
在我的示例中,我将发送递归函数的下一个调用,即当前的总值。在上面@uselpa;给出的示例中,他让python通过将函数放在运算符
+
之后来计算对该函数的下一次调用:这就变成了(对于
recursive_me("4567")
)因为python需要在这里返回一个值,但是表达式一直在调用新函数,而python在将所有函数求值为一个最终数字(在本例中至少是这样)之前无法返回。
通常的做法是将这些变量保存为参数,并沿链传递它们。在您的例子中,您可能希望将total作为一个附加参数传递,并根据需要更新它。
在python中也有一种简洁的函数方法
这在本质上是递归的。
相关问题 更多 >
编程相关推荐