我正在尝试从教科书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()
或许我想打开一个包含数字的txt文件,然后使用递归?
我相信递归就像这样
def function()
> if something:
>>return 0
>else:
>>return function()
答案 0 :(得分:13)
您对递归工作的理解似乎很好。
你的if-block搞砸了,你有两个else
到一个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()
答案 1 :(得分:4)
这是解决上述问题的另一种方法
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
答案 2 :(得分:2)
基本方法就是这样。
Max
以找到这些元素的最大值。现在你有一些语法错误。例如,对于单个else
,您有两个if
子句,缩进看起来很有趣。 else
块只能有一个if
。但是,如果您按照这些说明操作,则应该有一个有效的算法。
答案 3 :(得分:2)
我发布了问题的不同解决方案。大多数答案在每个递归调用中使用切片运算符操作列表。当练习没有提供要使用的严格函数原型时,我也将函数参数传递给列表的长度。
假设我们尝试从 n 元素的 S 序列中查找并返回最大元素。
功能原型: 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个大多数元素的序列。
为了对抗无限递归,Python的设计者做了一个 故意决定限制功能的总体数量 可以同时激活的激活。精确的价值 此限制取决于Python分发,但是典型的默认值 值为
1000
。如果达到此限制,则为Python解释器 使用RuntimeError
消息提出maximum recursion depth exceeded
。Michael T. Goodrich(2013),Data Structures and Algorithms in Python,Wiley
要更改默认值,请执行以下操作:
import sys
sys.setrecursionlimit(1000000)
答案 4 :(得分:1)
def Max(lis,maxx=-float("inf")):
if len(lis) == 1: #only one element in lis
return maxx if maxx>lis[0] else lis[0] #return lis[0] if it's greater than maxx
else:
m=lis[0] if lis[0]>maxx else maxx # m = max(lis[0],maxx)
return Max(lis[1:],m) #call Max with lis[1:] and pass 'm' too
print Max([1,2,39,4,5,6,7,8]) #prints 39
print Max([1,2,3,4,5,6,7,8]) #prints 8
答案 5 :(得分:1)
这些解决方案在某些列表大小后失败。
这是一个更好的版本:
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
答案 6 :(得分:0)
一种简单的方法是先对列表进行排序,然后再使用索引。
这是一个可以正常工作的功能:
a = [1,233,12,34]
def find_max(a):
return sorted(a)[-1]
答案 7 :(得分:0)
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()
答案 8 :(得分:0)
你也可以这样做:
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)
答案 9 :(得分:0)
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, ]))
答案 10 :(得分:-1)
这是我的答案,只有一行代码:))
def max_value(n_list):
return n_list[0] if len(n_list) == 1 else max(n_list[0], max_value(n_list[1:]))
答案 11 :(得分:-3)
def getMaxNumber(numbers):
return 'N.A' if len(numbers) == 0 else max(numbers)