2012-08-10 91 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

相關問題