2012-08-10 69 views
0

我知道有更简单的方法来创建一个函数,它可以给出数字列表中最大的数字,但我想使用递归。当我把这个功能称为最伟大的时候,我什么都没有。例如最大([1,3,2])没有给我。如果列表中只有两个元素,我会得到正确的答案,所以我知道问题必须与调用它自己的函数有关。不知道为什么。通过传递一个列表在Python中递归调用一个函数

def compare(a,b): 
    if a==b: 
     return a 
    if a > b: 
     return a 
    if a < b: 
     return b 


def greatest(x): 
    if len(x)==0: 
     return 0 
    i=0 
    new_list=[] 
    while i< len(x): 
     if len(x)-i>1: 
      c=compare(x[i],x[i+1]) 
     else: 
      c=x[i] 
     new_list.append(c) 
     i=i+2 
    if len(new_list)>1: 
     greatest(new_list) 
    else: 
     return new_list[0] 

print greatest([1,3,2]) 
+1

看看[如何格式化我的代码块?](http://meta.stackexchange.com/q/22186)以备日后发布。 – 2012-08-10 18:05:39

+0

谢谢。关于这个问题的任何想法? – 2012-08-10 18:08:53

+1

这看起来......过于复杂。 'compare'可以用内置的'max'替换,并且递归解决方案不应该循环遍历列表 - 只需要比较'x [0]'和'最大(x [1:])'。 – Izkata 2012-08-10 18:12:21

回答

5

这条线:

if len(new_list)>1: 
    greatest(new_list) # <- this one here 

电话greatest但不会用它做返回任何有价值的东西。你想

return greatest(new_list) 

固定在此之后,你的功能似乎表现(虽然我没看太密切):

>>> import itertools 
>>> for i in range(1, 6): 
...  print i, all(max(g) == greatest(g) for g in itertools.product(range(-5, 5), repeat=i)) 
... 
1 True 
2 True 
3 True 
4 True 
5 True 
+0

谢谢。我明白你的意思了。 – 2012-08-10 18:11:30

1

一个简单而又重复,可就是这样:

from random import * 
def greatest(x,maxx=float("-inf")): 
    if len(x)>0: 
     if x[0] > maxx: 
      maxx=x[0] 
     return greatest(x[1:],maxx) 
    else: 
     return maxx 

lis=range(10,50) 
shuffle(lis) 
print greatest(lis) #prints 49 
+0

您可以通过如下几行来简化:https://gist.github.com/meonkeys/5132023 – 2013-03-11 05:09:32

+0

@AdamMonsen谢谢,解决方案已更新。 – 2013-03-11 14:21:03

+0

不客气。看起来现在有一个缩进错误('return maxx'应该被缩进一个tabstop)。 – 2013-03-11 18:24:26

相关问题