2016-05-14 36 views
0

所以我必須做一個函數返回一個列表從n到1,其中n將被2除並添加到一個列表中,然後數字除以2將乘以3和將1來概括這自然會去,直到它到達1號。 的代碼,我到目前爲止有:一個python未完成函數

def Gaus(n): 
    list = [] 
    if n%2 == 0: 
     list.append(n/2) 
    else: 
     list.append((n*3)+1) 
    return list 

所以GAUS(30)應返回: [15,46,23, 70 ....,2]

我是新來的堆棧溢出,所以對不起,如果我問的方式不夠清楚。謝謝!

+0

提出新的問題,而不是 – GingerPlusPlus

回答

0

如果我正確理解你的問題......這是一個遞歸實現:

def gaus(n, ls = list()): 
    if n == 1: 
     return ls 
    else: 
     ls.append(n/2.)   # Step 1: n/2 
     ls.append(ls[-1] * 3 + 1) # Step 2: (n/2) * 3 + 1 
     return gaus(n - 1, ls) 

print gaus(30) 

結果是這樣的名單:

[15.0, 46.0, 14.5, 44.5, 14.0, 43.0, 13.5, 41.5, 13.0, 40.0, 12.5, 38.5, 12.0, 37.0, 11.5, 35.5, 11.0, 34.0, 10.5, 32.5, 10.0, 31.0, 9.5, 29.5, 9.0, 28.0, 8.5, 26.5, 8.0, 25.0, 7.5, 23.5, 7.0, 22.0, 6.5, 20.5, 6.0, 19.0, 5.5, 17.5, 5.0, 16.0, 4.5, 14.5, 4.0, 13.0, 3.5, 11.5, 3.0, 10.0, 2.5, 8.5, 2.0, 7.0, 1.5, 5.5, 1.0, 4.0] 

編輯

def print_gaus(n): 
    if n == 1: 
     return 
    else: 
     if n % 2 == 0: 
      print (n/2), 
      print (n/2 * 3 + 1), 
      print_gaus(n/2 * 3 + 1) 
     print_gaus(n - 1) 

print print_gaus(30) 

但注意,這將打破,因爲你的環境的最大遞歸深度。

+0

這幾乎是應該的,每次這個數字甚至它應該返回這個數字除以二,所以46/2 = 23而不是14.5。數字23應該乘以3,然後總結爲:23 * 3 + 1 = 70.然後過程應該重新開始,70/2 = 35然後35 * 3 + 1 = 106 ...所以直到它達到第一... :) – Andrea

+0

馬克,它沒有達到第一,因爲你增加了一個因素的價值。請看這裏的數字:'15 46 23 70 35 106 53 160 80 241 120 361 180 541 270 811 405 1216 608 1825 912 2737 1368 4105 2052 6157 3078 9235 4617 13852 6926 20779 10389 31168 15584 46753 23376 70129 35064 105193 52596 157789 78894 236683 118341 355024 177512 532537 266268 798805 399402 ...'。 –

+0

是的你是對的!我如何獲得這些結果的功能? – Andrea

1
def fun(num): 
    n = num 
    l = list() 
    while n>1: 
     r = n/2 
     l.append(r) 
     n = r 
    return [i*3+1 for i in l] 

,如果我明白你的問題正確,這將解決

0

我的意思這和它的作品!:

def Gaus(n): 
    list = [] 
    list.append(n) 
    if n > 0 and n == int(n): 
     while n != 1: 
      if n % 2 == 0: 
       n = n/2 
       list.append(n) 
      else: 
       n = (n*3)+1 
       list.append(n) 
     return list 
    else: 
     print "The given input number is not a natural number, try again!"