2017-08-31 14 views
5

Tôi hiện đang gặp khó khăn hoàn thành thử thách này trong "Tự động hóa những thứ nhàm chán":Thực hiện chức năng Collatz sử dụng Python

Image of the challenge

Mã của tôi là:

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) 

Và Tôi nhận này lỗi:

"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" 

Tôi biết tôi đang làm SOMETHIN G sai với cách tôi viết mã của mình nhưng tôi không hiểu chính xác nó là gì. Bất kỳ và tất cả trợ giúp được đánh giá cao!

Ngoài ra tôi đang sử dụng python 3.

+0

Bạn không sử dụng lập luận của bạn ... Tôi nghĩ rằng bạn muốn sử dụng số thay vì SEQNUM. Và điều này không làm việc vì đầu vào trả về một chuỗi, mà không phải là một số. Ngoài ra, bạn không thực sự cần 'elif', bạn chỉ có thể sử dụng' else' vì giá trị duy nhất có thể khác là 1. – jszakmeister

+0

^và loại bỏ khai báo toàn cầu ở đó, điều đó không giúp ích cho – FreshPow

Trả lời

4
  1. Bạn đang làm số học trên một chuỗi chứ không phải số nguyên.

  2. Không cần phải có biến số global. Vượt qua một đối số cho một hàm và trả về một giá trị tương ứng.


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

Ngoài ra tôi đã có một câu hỏi về điều này: Vì vậy, bạn đã viết "trong khi True" kể từ khi tôi đang gọi hàm collatz() và chức năng không có giá trị có thể có của False? Ngoài ra tôi có thể sử dụng bất cứ biểu hiện nào sau đó không? Vì vậy, nếu tôi muốn tôi có thể viết trong khi sai, 1 <2, vv? Xin lỗi cho những câu hỏi câm chỉ cố gắng để giúp bản thân mình hiểu điều này – Xert01998

+0

Tôi chạy nó với 12 và nhận được trình tự đầy đủ? đang bối rối – Xert01998

1

seqNum là một chuỗi.

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

... giải pháp sẽ là sử dụng 'số'. –

+0

Tôi không nghĩ rằng điều này đủ điều kiện như là một câu trả lời thực sự cho câu hỏi. –

+1

@ cᴏʟᴅsᴘᴇᴇᴅ Vâng, nói từ một quan điểm thuần túy về mặt kỹ thuật, _does_ này trả lời câu hỏi. Điều này sẽ giải quyết lỗi mà OP được đăng. Tuy nhiên, người ta có thể nói rằng đây là một câu trả lời phụ tối ưu. –

0

Có vẻ như bạn cần vượt qua i đến chức năng của bạn thay vì seqNum.

Và chức năng của bạn xóa tất cả các tham chiếu đến seqNum và sử dụng number thay thế.

3

Có một số vấn đề ở đây, nhưng một trong những ngoại lệ gây của bạn là bạn sử dụng seqNum trong hàm, đó là những gì input() trả lại. Và input() trả về một chuỗi (ít nhất là trên Python 3). Và đối với strings the % là "toán tử định dạng" cũng giải thích thông báo ngoại lệ, thông báo nói về "định dạng chuỗi".

Bạn có thể viết như sau (sử dụng number thay vì seqNum):

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) 
Các vấn đề liên quan