保留变量值的Python递归函数

2024-05-14 17:54:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在复习一些好的旧算法,并使用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),尽管当第一次调用递归函数时,函数会重置总值。

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


Tags: 函数字符串算法lendef数字int重置
4条回答

您可以这样简单地编写代码:

def recursive_me(mystring):
    if mystring: # recursive case
        return int(mystring[0]) + recursive_me(mystring[1:])
    else:        # base case
        return 0

或者

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中没有多大帮助,因为它没有实现尾部调用优化。

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

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

那么

4
9
15
22
22 # this is the return value; previous output is from `print()`

前言:在我写这个答案的同时,很多答案都得到了有意义的编辑。别跟我作对。

我把我的两分钱投在这里只是因为有很多过于复杂的答案。 这是一个正确的复制粘贴操作的努力。

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,并将其添加到total中。第一个错误是您编写了str[0]str是一个python内置类型,产生的错误类似于“str不可订阅”。

此错误表示“[]运算符无法对str进行操作。如果你试着做1[0]同样的事情,因为1是一个整数。“[%”运算符只能对列表、元组和字符串进行操作(我可能忘记了一些内置类型)。

第二个错误是添加部分。你已经写了total = + first,但是你要找的运算符是+=,实际上这只是写a = a+b的一种简化方法。

另外,您最初的问题是关于“python”忘记了“total”的值。这是因为您要么向前传递该值,要么以一种“强制”它的方式编写递归函数,即所谓的,当场计算下一次对函数的调用。

在我的示例中,我将发送递归函数的下一个调用,即当前的总值。在上面@uselpa;给出的示例中,他让python通过将函数放在运算符+之后来计算对该函数的下一次调用:

return int(mystring[0]) + recursive_me(mystring[1:])

这就变成了(对于recursive_me("4567")

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在将所有函数求值为一个最终数字(在本例中至少是这样)之前无法返回。

前言:在我写这个答案的同时,很多答案都得到了有意义的编辑。别跟我作对。

我把我的两分钱投在这里只是因为有很多过于复杂的答案。 这是一个正确的复制粘贴操作的努力。

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,并将其添加到total中。第一个错误是您编写了str[0]str是一个python内置类型,产生的错误类似于“str不可订阅”。

此错误表示“[]运算符无法对str进行操作。如果你试着做1[0]同样的事情,因为1是一个整数。“[%”运算符只能对列表、元组和字符串进行操作(我可能忘记了一些内置类型)。

第二个错误是添加部分。你已经写了total = + first,但是你要找的运算符是+=,实际上这只是写a = a+b的一种简化方法。

另外,您最初的问题是关于“python”忘记了“total”的值。这是因为您要么向前传递该值,要么以“强制”它的方式编写递归函数,即所谓的,当场计算下一次对函数的调用。

在我的示例中,我将发送递归函数的下一个调用,即当前的总值。在上面@uselpa;给出的示例中,他让python通过将函数放在运算符+之后来计算对该函数的下一次调用:

return int(mystring[0]) + recursive_me(mystring[1:])

这就变成了(对于recursive_me("4567")

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在将所有函数求值为一个最终数字(在本例中至少是这样)之前无法返回。

通常的做法是将这些变量保存为参数,并沿链传递它们。在您的例子中,您可能希望将total作为一个附加参数传递,并根据需要更新它。

在python中也有一种简洁的函数方法

t=raw_input()
print reduce(lambda a, b: a+b, map(int,t))

这在本质上是递归的。

相关问题 更多 >

    热门问题