Python:用于查找列表中最大数字的递归函数
我正试图做一个来自教科书Zelle Python编程的实验工作 这个问题要求我“编写并测试一个递归函数Python:用于查找列表中最大数字的递归函数,python,recursion,Python,Recursion,我正试图做一个来自教科书Zelle Python编程的实验工作 这个问题要求我“编写并测试一个递归函数max(),以找到列表中的最大值。max是第一项和所有其他项中的较大值。”我不太理解教科书中的问题 def Max(list): if len(list) <= 1: else: return list[0] else: m = Max(list[1:]) return m if
max()
,以找到列表中的最大值。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()
您对递归工作原理的理解似乎很好 如果if块出错,则两个
else
s与一个if
对齐失败。您需要删除第一个else
,如果为一级,则取消缩进下的所有内容。例如:
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()
基本方法是这样的
如果列表仅包含单个元素,则该元素为最大值。立即返回该元素
否则,列表将包含多个元素。列表中的第一个元素要么是最大值,要么不是
第一个元素的最大值就是列表中的第一个元素李>
递归调用其余元素(除第一个元素外的所有元素)的Max
,以查找这些元素的最大值
比较步骤3和步骤4的结果。结果是一个更大的数字。归还它
现在您有一些语法错误。例如,对于单个if
,您有两个else
子句,缩进看起来很有趣。对于if
块,只能有一个else
。但是,如果您按照这些说明进行操作,您应该有一个有效的算法。这里是解决上述问题的另一种方法
def maximum(L):
if len(L) == 1:
return L[0]
else:
return max(L[0],maximum(L[1:]))
因此,示例输入和输出:
L= [2,4,6,23,1,46]
print maximum(L)
产生
46
这些解决方案在特定的列表大小后失败
这是一个更好的版本:
def maximum2(a, n):
if n == 1:
return a[0]
x = maximum2(a[n//2:], n - n//2)
return x if x > a[0] else a[0]
def maximum(a):
return maximum2(a, len(a))
maximum(range(99999))
>>> 99998
我发布了一个不同的问题解决方法。大多数答案在每次递归调用中都使用slice操作符来操作列表。当练习没有提供要使用的严格函数原型时,我还将列表的长度作为函数参数传递
假设我们试图从S序列中找到并返回n个元素中的最大元素
功能原型:Max(S,n)
基本大小写:如果S只包含一个项目,请将其返回。(很明显,序列中唯一的项目是最大值。)
重复:如果不是基本情况,则每次调用Max
以减少一个项目,即调用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))
注意:递归实现在默认情况下仅适用于包含1000个most元素的序列
为了对抗无限递归,Python的设计者提出了一个
有意决定限制函数的总数
可以同时激活的激活。精确的价值
此限制取决于Python发行版,但这是一个典型的默认值
值为1000
。如果达到此限制,Python解释器
引发运行时错误
,并显示一条消息,超过最大递归深度
Michael T.Goodrich(2013),Wiley
要更改默认值,请执行以下操作:
import sys
sys.setrecursionlimit(1000000)
一种简单的方法是先对列表排序,然后使用索引
下面是一个可以工作的函数:
a = [1,233,12,34]
def find_max(a):
return sorted(a)[-1]
这是我的答案,只有一行代码:))
您也可以这样做:
def maximum(data, start, stop):
if start >= stop:
return data[start]
else:
if data[start] >= data[stop - 1]:
return maximum(data, start, stop - 1)
else:
return maximum(data, start + 1, stop)
测试:
问题是什么?不清楚。很抱歉,问题来自教科书,所以我不知道如何澄清。第一个if
案例只有在列表==[]
时才有效,它没有0
第th元素。不得不承认,除了明显的错误之外,我没有仔细检查代码!谢谢你给我解释你的答案。所以存在不仅是为了回答问题,而且是为了教学。感谢您的回答,虽然您的代码可能有效,但请包括一个简短的解释,说明代码正在做什么。这有助于用户更好地理解它。谢谢,希望这些评论能有所帮助:)很棒的文章,乔治。我想再问一个问题。我的代码如下:def large(x):if len(x)==1:返回x.pop(0)else:temp=x.pop(0)previous=large(x)if previous>=temp:return previous else:return temp;它可以工作,但是如果我使用def-large(x):if-len(x)==1:return x.pop(0)else:temp=x.pop(0)if-large(x)>=temp:return-large(x)else:return-temp(0)。它将返回错误。你介意把它弄清楚吗?谢谢。
import sys
sys.setrecursionlimit(1000000)
a = [1,233,12,34]
def find_max(a):
return sorted(a)[-1]
def find_max(arr):
"""find maximum number in array by recursion"""
if arr == []: # if its an empty array
return 0
if len(arr) == 1: # if array has only one element
return arr[0]
else: # get max of first item compared to other items recursively
return max(arr[0], find_max(arr[1:])) # 1: means all other excluding 0th element
def main():
print(find_max([2,3,5,6,7,1])) # will print max - 7
if __name__ == "__main__":
main()
def max_value(n_list):
return n_list[0] if len(n_list) == 1 else max(n_list[0], max_value(n_list[1:]))
def maximum(data, start, stop):
if start >= stop:
return data[start]
else:
if data[start] >= data[stop - 1]:
return maximum(data, start, stop - 1)
else:
return maximum(data, start + 1, stop)
def recursiveMax(a):
if len(a) == 1:
return a[0]
else:
return a[0] if a[0] > recursiveMax(a[1:]) else recursiveMax(a[1:])
print(recursiveMax([1, 2, 15, 6, 3, 2, 9]))
print(recursiveMax([98, 2, 1, 1, 1, 1, ]))