2017-08-31 20 views
5

मैं वर्तमान में मुसीबत "बोरिंग सामान स्वचालित करें" में इस चुनौती को पूरा करने के चल रहा है का उपयोग कर Collatz समारोह को लागू करने:अजगर

Image of the challenge

मेरे कोड है:

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) 

और मैं इस हो रही है त्रुटि:

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

मुझे पता है कि मैं कुछ कर रहा हूँ जी ने अपना कोड कैसे लिखा है, लेकिन मुझे समझ में नहीं आता कि यह वास्तव में क्या है। थोड़ी और सारी मदद अत्यंत सराहनीय है!

इसके अलावा, मैं अजगर 3.

+0

आप अपने तर्क का उपयोग नहीं कर रहे हैं ... मुझे लगता है कि आप SEQNUM के बजाय नंबर का उपयोग करना चाहते हैं। और यह काम नहीं करता है क्योंकि इनपुट एक स्ट्रिंग देता है, जो कि संख्या नहीं है। साथ ही, आपको वास्तव में 'एलिफ' की आवश्यकता नहीं है, आप केवल 'अन्य' का उपयोग कर सकते हैं क्योंकि एकमात्र अन्य संभावित मूल्य 1. – jszakmeister

+0

^है और वैश्विक घोषणा से छुटकारा पाएं, जो – FreshPow

उत्तर

4
  1. आप एक स्ट्रिंग पर अंकगणित कर रहे हैं, पूर्णांक नहीं।

  2. global चर के लिए कोई आवश्यकता नहीं है। किसी फ़ंक्शन को तर्क दें, और उसके अनुसार यह मान वापस कर दें।


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

इसके अलावा मुझे इसके बारे में एक सवाल भी था: इसलिए आपने "जबकि सत्य" लिखा था क्योंकि मैं collatz() फ़ंक्शन को कॉल कर रहा हूं और फ़ंक्शन का गलत मूल्य नहीं है? मैं भी बाद में जो भी अभिव्यक्ति का उपयोग कर सकता हूं? तो अगर मैं चाहता था कि मैं गलत, 1 <2, आदि लिख सकता हूं? बेवकूफ सवालों के लिए खेद है कि मैं इसे – Xert01998

+0

समझने में मदद करने की कोशिश कर रहा हूं, मैंने इसे 12 के साथ भाग लिया और पूर्ण अनुक्रम प्राप्त किया? उलझन में हूँ – Xert01998

1

seqNum उपयोग कर रहा हूँ एक श्रृंखला है।

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

की सहायता नहीं कर रहा है ... समाधान 'संख्या' का उपयोग करना होगा। –

+0

मुझे नहीं लगता कि यह प्रश्न के वास्तविक उत्तर के रूप में योग्य है। –

+1

@ cᴏʟᴅsᴘᴇᴇᴅ ठीक है, पूरी तरह तकनीकी दृष्टि से बोलते हुए, यह _does_ सवाल का जवाब देता है। यह ओपी पोस्ट की गई त्रुटि को हल करेगा। कोई कह सकता है कि यह एक उप-इष्टतम उत्तर का थोड़ा सा है। –

0

ऐसा लगता है कि आप अपने बजाय समारोह seqNum करने के लिए i पास करना चाहिए।

और अपने फ़ंक्शन में seqNum पर सभी संदर्भ हटाएं और इसके बजाय number का उपयोग करें।

3

वहाँ कई समस्याओं यहाँ हैं, लेकिन एक अपने अपवाद के कारण है कि आप समारोह है, जो है क्या input() लौटे में seqNum का उपयोग करें। और input() एक स्ट्रिंग देता है (कम से कम पायथन 3 पर)। और strings the % के लिए "स्वरूपण ऑपरेटर" है जो अपवाद संदेश भी बताता है, जिसने "स्ट्रिंग स्वरूपण" के बारे में बात की थी।

आप इसे लिख सकता है इस प्रकार है (numberseqNum के बजाय का उपयोग कर):

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)