我正在尝试从教科书Zelle Python Programming做一个实验室工作
这个问题让我"编写并测试一个递归函数max()来查找列表中的最大数字.最大值是第一个项目中的较大项目和所有其他项目中的最大项目." 我不太明白教科书中的问题.
def Max(list):
if len(list) <= 1:
else:
return list[0]
else:
m = Max(list[1:])
return m if m > list[0] else list[0]
def main():
list = eval(raw_input(" please enter a list of numbers: "))
print("the largest number is: ", Max(list))
main()
Run Code Online (Sandbox Code Playgroud)
或者也许我想打开一个带有数字的txt文件,然后使用递归?
我相信这样的递归工作
def function()
> if something:
>>return 0
>else:
>>return function()
Run Code Online (Sandbox Code Playgroud)
jam*_*jam 13
你对递归如何工作的理解似乎很好.
你的if-block搞砸了,你有两个elses if对齐,对齐就出来了.你需要else在if一个级别下删除你的第一个和非缩进的一切.例如:
def Max(list):
if len(list) == 1:
return list[0]
else:
m = Max(list[1:])
return m if m > list[0] else list[0]
def main():
list = eval(raw_input(" please enter a list of numbers: "))
print("the largest number is: ", Max(list))
main()
Run Code Online (Sandbox Code Playgroud)
我发布了一个不同的问题解决方法。大多数答案在每次递归调用中使用切片运算符操作列表。当练习没有提供要使用的严格函数原型时,我还将列表的长度作为函数参数传递。
假设我们试图找到并从序列返回的最大元素小号的,ñ元素。
函数原型: Max(S, n)
基本情况:如果S只包含一项,则返回它。(显然,序列中唯一的项目是最大的项目。)
重复:如果不是基本情况,则Max每次调用少一个项目,即 call Max(S, n-1)。然后,我们将返回值存储到一个名为的变量中,该变量previous指示序列中的前一个元素,并使用序列中的下一个元素(即当前递归调用中最右边的元素)检查该值,并返回这些值的最大值。
下图给出了上述过程的递归跟踪。假设我们尝试从包含 的列表中找到最大值[5, 10, 20, 11, 3]。
注意:为了进一步帮助您,请记住我们从最右边的元素到最左边的元素递归地迭代列表。
最后是工作代码:
def find_max_recursively(S, n):
"""Find the maximum element in a sequence S, of n elements."""
if n == 1: # reached the left most item
return S[n-1]
else:
previous = find_max_recursively(S, n-1)
current = S[n-1]
if previous > current:
return previous
else:
return current
if __name__ == '__main__':
print(find_max_recursively([5, 10, 20, 11, 3], 5))
Run Code Online (Sandbox Code Playgroud)
注意:默认情况下,递归实现仅适用于最多 1000 个元素的序列。
为了对抗无限递归,Python 的设计者有意决定限制可以同时激活的函数激活的总数。此限制的精确值取决于 Python 分布,但典型的默认值为
1000. 如果达到此限制,Python 解释器将引发RuntimeError带有消息maximum recursion depth exceeded.Michael T. Goodrich (2013),Python 中的数据结构和算法,Wiley
要更改默认值,请执行以下操作:
import sys
sys.setrecursionlimit(1000000)
Run Code Online (Sandbox Code Playgroud)