2012-10-03 42 views
2

我试图做从教科书Zelle Python编程的Python:递归函数在列表中找到

问题的实验室工作要求我“写人数最多和测试一个递归函数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

问题是什么?不清楚。 –

+0

对不起这个问题从教科书来了,所以我不知道如何使它更清晰 –

回答

12

你的递归是如何工作的优良似乎理解。

你的if块被搞砸了,你有两个else s到一个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

第一'if'情况下才有效,如果'名单== []',它没有一个'0'th元素。 – Blender

+1

不得不承认我没有仔细检查那些明显的错误以外的代码!感谢您的支持 – jam

+0

哦,哇,它的工作:哦,非常感谢你! –

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 
2

的基本做法是这样的。

  1. 如果列表仅包含单个元素,则该元素为最大值。立即返回。
  2. 否则,该列表包含多个元素。列表中的第一个元素是最大值,否则不是。
  3. 第一个元素的最大值只是列表中的第一个元素。
  4. 递归调用Max其余的(除第一个元素外)找到这些元素的最大值。
  5. 比较步骤3和4的结果。结果是数字更大。把它返还。

现在你有一些语法错误。例如,对于单个if,您有两个else条款,并且缩进看起来很有趣。对于if块,您只能有一个else。但是,如果你按照这些说明,你应该有一个工作的算法。

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 
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 
-3
def getMaxNumber(numbers): 
    return 'N.A' if len(numbers) == 0 else max(numbers) 
+0

你需要解释你的答案。 SO的存在不仅仅是回答问题,而是教导。 – Machavity

1

我张贴的问题的不同的解决方法。大多数答案在每次递归调用中都使用切片运算符处理列表。当练习没有提供要使用的严格函数原型时,我还将函数参数作为列表的长度。

假设我们试图找到并从序列小号返回ñ元素的最大元素。

函数原型:Max(S, n)

基本情况:如果小号包含一个项目,其返回。 (显然序列中的唯一项为最大一个。)

重复执行:如果没有基座的情况下,调用Max每次少一个项,即调用Max(S, n-1)。然后我们将返回值存储到名为previous的变量中,该变量指示序列中的上一个元素,并使用序列中的下一个元素(即当前递归调用中最右侧的元素)检查该值,并返回这些值的最大值。

上述过程的递归跟踪在下面图中给出。假设我们试图从包含[5, 10, 20, 11, 3]的列表中找到最大值。

Recursion trace

注:为了进一步帮助你,记住,我们递归地从右侧迭代列表最元素最左边的一个。

最后这里是工作代码:

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发行,但一个典型的默认 值为1000。如果达到此限制,Python解释器 会生成一个RuntimeError,并显示消息maximum recursion depth exceeded

迈克尔·古德里奇(2013年),Data Structures and Algorithms in Python,威利

要更改默认值做:

import sys 
sys.setrecursionlimit(1000000)