Python

2017-08-31 92 views
5

Şu anda sorun "sıkıcı şeyler Otomatik" in bu zorluğu tamamlayarak yaşıyorum kullanarak Collatz fonksiyonunu uygulamak:Python

Image of the challenge

Benim kodudur:

def collatz(number): 
    global seqNum 
    if (seqNum % 2 == 0): 
     return seqNum // 2 
    elif (seqNum % 2 == 1): 
     return 3 * seqNum + 1 


print('What number would you like to use?') 
seqNum = input() 
number = int(seqNum) 
i = number 

while i > 1: 
    collatz(seqNum) 
    print(number) 

Ve bu soruyla hata:

"Traceback (most recent call last): 
    File "C:/Users/Administrative/AppData/Local/Programs/Python/Python36-32/collatzSeq.py", line 15, in <module> 
    collatz(seqNum) 
    File "C:/Users/Administrative/AppData/Local/Programs/Python/Python36-32/collatzSeq.py", line 3, in collatz 
    if (seqNum % 2 == 0): 
TypeError: not all arguments converted during string formatting" 

SOMETHIN yapıyorum biliyorum Kodumu nasıl yazdığımı yanlış ama tam olarak ne olduğunu anlamıyorum. Her türlü yardım büyük beğeni topluyor! Ayrıca ben

+0

... Ben yerine SEQNUM sayısını kullanmak istiyorum düşünüyorum. Ve bu işe yaramaz çünkü girdi bir sayı değil, bir dizge döndürür. Ayrıca, gerçekten bir "elif" e ihtiyacınız yok, sadece 'else' değerini kullanabilirsiniz, çünkü diğer olası değer 1'dir. – jszakmeister

+0

^ve oradaki küresel bildirgeden kurtulun, bu da – FreshPow

cevap

4
  1. Bir tamsayı değil, bir dizede aritmetik yapıyorsunuz.

  2. global değişkenine sahip olmanıza gerek yoktur. Bir argümanı bir işleve iletin ve buna göre bir değer döndürün. Orada


def collatz(number): 
    if (number % 2 == 0): 
     return number // 2 

    elif (number % 2 == 1): 
     return 3 * number + 1 

print('What number would you like to use?') 

i = int(input()) 
while i > 1:  
    i = collatz(i) 
    print(i) 
+0

Ayrıca bu konuda bir sorum vardı: Yani "while True" yazdım çünkü collatz() işlevini çağırıyorum ve fonksiyonun False'nin olası değerleri yok mu? Ayrıca ne olursa olsun ifade kullanabilir miyim? Yani eğer isteseydim, yanlış yazabilirim, 1 <2, vs.? Sadece bu kendimi anlamaya çalışıyorum aptal sorular için özür dilerim – Xert01998

+0

Ben 12 ile koştu ve tüm dizi aldı? kafam karıştı – Xert01998

1

seqNum piton 3. kullanıyorum

bir dizedir.

>>> "3" % 2 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: not all arguments converted during string formatting 
>>> 
+0

... Çözüm 'number' kullanmak olacaktır. –

+0

Bence bu soruya gerçek bir cevap olarak nitelendiriliyor. –

+1

@ cᴏʟᴅsᴘᴇᴇᴅ Tamamen teknik açıdan bakıldığında, bu _does_ soruya cevap veriyor. Bu, OP'nin yayınladığı hatayı çözecektir. Bununla birlikte, bunun bir alt-optimal cevabı olduğu söylenebilir. –

0

sizin işlevi yerine seqNum için i geçmesi gerektiğini görünüyor.

Ve işinizde seqNum tüm başvuruları kaldırın ve bunun yerine number kullanın.

3

çeşitli sorunlar burada, ama sizin İstisna neden bir sen input() döndü budur fonksiyonuna, seqNum kullanmasıdır. Ve input() bir dize döndürür (en azından Python 3'te). Ve strings the % için "dizgi biçimlendirme" hakkında konuşulan istisna mesajını da açıklayan "biçimlendirme operatörü" dir. aşağıdaki gibi

Sen (number yerine seqNum kullanarak) yazabilirim: Eğer argüman kullanmıyorsunuz

def collatz(number): 
    # you pass the number to the function and you return, so no need for global   
    if number % 2 == 0:  # python doesn't need parenthesis for "if"s 
     return number // 2 
    else:      # it can only be even OR odd so no need to calculate the modulo again 
     return 3 * number + 1 

# You can put the question as argument for "input" instead of printing it 
seqNum = input('What number would you like to use?') 
number = int(seqNum) 

while number > 1 : 
    number = collatz(number) # assign the result of the function to "number" 
    print(number)