2016-03-22 14 views
2

Ben yaptık-Collatz Fonksiyonu:Recursive

def collatz(b): 
    l=[b] 
    if b==1: 
     return 1 
    elif b%2==0: 
     l.append(collatz(b/2)) 
    else: 
     l.append(collatz(b*3+1)) 
    return l 

ama böyle çıktı:

>>>[21, [64, [32, [16, [8, [4, [2, 1]]]]]]] 

nasıl böyle çıktı yapmak için (özyinelemeli fonksiyonu ile):

>>>Collatz: 21 64 32 16 8 4 2 1 

cevap

3

append yerine extend kullanın ve "düz" bir liste döndürmek için her zaman bir liste döndürdüğünüzden emin olun. :

def collatz(b): 
    l=[b] 
    if b==1: 
     return [1]     # wrapped in list 
    elif b%2==0: 
     l.extend(collatz(b/2))  # extend 
    else: 
     l.extend(collatz(b*3+1)) # extend 
    return l 

Ya da belki biraz daha özlü: Bunu Collatz: öneki dönmek isterseniz, bir sarmalayıcı işlevi kullanmak zorunda

def collatz(b): 
    if b == 1: 
     return [b] 
    elif b%2==0: 
     return [b] + collatz(b/2) 
    else: 
     return [b] + collatz(b*3+1) 

: Tobias olarak

def collatz(x): 
    def collatz_inner(b): 
     if b == 1: 
      return [b] 
     elif b%2==0: 
      return [b] + collatz_inner(b/2) 
     else: 
      return [b] + collatz_inner(b*3+1) 
    return "Collatz: " + ' '.join(map(str, collatz_inner(x))) 
3

zaten cevap , bir düz liste almak için eklemek değil uzatmak gerekir, ancak geri verilen değerlerin düz bir listesini almak için [b] + collatz... dönen bir if/else kullanabilirsiniz:

def collatz(b): 
    if b == 1: 
     return [b] 
    return [b] + collatz(b/2) if not b % 2 else [b] + collatz(b * 3 + 1) 

Sen ancak bir baskı ile istediğiniz çıkış biçimi: Muhtemelen de girdi olmayan negatif olduğundan emin olmak gerekir veya bir RuntimeError sona erecek

In [5]: from __future__ import print_function 

In [6]: print("Collatz :",*collatz(20)) 
Collatz : 20 10 5 16 8 4 2 1 

.

+1

Veya daha da kısa: '[b] + collatz (b/2 değilse b% 2 else b * 3 + 1)'. Btw, '' 'ile' print' kullanarak güzel bir hile. :-) –

İlgili konular