首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >保留变量值的Python递归函数

保留变量值的Python递归函数
EN

Stack Overflow用户
提问于 2015-12-29 22:07:23
回答 5查看 28.5K关注 0票数 9

我正在研究一些好的老算法,并使用python,因为我现在更频繁地使用它。

在运行递归函数时,我面临一个问题;每当递归函数调用自身时,变量都会被重置:

代码语言:javascript
运行
复制
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),尽管当第一次调用递归函数时,函数会重置总价值。

在使用递归函数运行操作时使用全局变量是常见的习惯还是我做错了什么?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2015-12-29 22:13:28

您可以简单地编写如下代码:

代码语言:javascript
运行
复制
def recursive_me(mystring):
    if mystring: # recursive case
        return int(mystring[0]) + recursive_me(mystring[1:])
    else:        # base case
        return 0

代码语言:javascript
运行
复制
def recursive_me(mystring, total = 0):
    if mystring: # recursive case
        return recursive_me(mystring[1:], total + int(mystring[0]))
    else:        # base case
        return total

虽然这在Python中没有多大帮助,因为它没有实现尾叫优化。

如果要查看中间值,请将第二个版本更改如下:

代码语言:javascript
运行
复制
def recursive_me(mystring, total = 0):
    if mystring: # recursive case
        newtotal = total + int(mystring[0])
        print(newtotal)
        return recursive_me(mystring[1:], newtotal)
    else:        # base case
        return total

然后

代码语言:javascript
运行
复制
4
9
15
22
22 # this is the return value; previous output is from `print()`
票数 10
EN

Stack Overflow用户

发布于 2015-12-29 22:33:01

作为前言:很多答案都是有意义的编辑,同时我也在写这个答案。别拿我当挡箭牌。

我把我的两分钱扔到这里只是因为有很多过于复杂的答案。这是OP努力的一个修正的拷贝粘贴。

代码语言:javascript
运行
复制
def recursive_me(mystring, total=0):
    chars = len(mystring)
    if chars is 0:
        print("Done")
        return total
    else:
        first = int(mystring[0])
        total += first
        print(total)
        recursive_me(mystring[1:], total)

首先,如果字符串中没有剩馀字符,我们将检查基本大小写。如果字符串长度为0,则返回计算出的总数。

否则,我们将第一个字符转换为int,并将其添加到总计。您遇到的第一个错误是编写了str[0]str是一个内置于类型中的python,产生的错误类似于"str是不可订阅的“。

此错误意味着"[]“运算符不能对str进行操作。如果您尝试执行1[0],也会发生同样的情况,因为1是一个整数。"[]“运算符只能对列表、元组和字符串进行操作(我可能忘记了一些内置类型)。

第二个错误是加法部分。您已经编写了total = + first,但是您要寻找的操作符是+=,这实际上只是编写a = a+b的一种缩短的方式。

此外,您最初的问题是关于"python“忘记了”总计“的值。这是因为您必须向前传递该值,或者以一种“强制”的方式编写递归函数,即对函数的下一次调用进行评估。

在我的示例中,我将发送函数recursive_me的下一个调用,即当前的总价值。在@uselpa给出的示例中,他在上面的python中,通过将函数放在操作符+之后,计算函数的下一个调用。

代码语言:javascript
运行
复制
return int(mystring[0]) + recursive_me(mystring[1:])

然后这将是(对于recursive_me("4567"))

代码语言:javascript
运行
复制
return int(4)+recursive_me("567")
return int(4)+int(5)+recursive_me("67")
....
return int(4)+int(5)+int(6)+int(7)+0

因为python需要在这里返回一个值,但是表达式一直在调用新函数,并且python不能返回,直到它将所有函数计算为最后一个数字(至少在本例中是这样)。

票数 3
EN

Stack Overflow用户

发布于 2015-12-29 22:08:57

通常的做法是将这些变量保存为参数,并沿着链传递它们。在您的情况下,您可能希望将总计作为附加参数传递,并根据需要更新它。

在python中也有一种简洁的功能方法

代码语言:javascript
运行
复制
t=raw_input()
print reduce(lambda a, b: a+b, map(int,t))

这在本质上是递归的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34519841

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档