web-dev-qa-db-ja.com

collat​​zプログラムで退屈なものを自動化する

Pythonで退屈なものを自動化するの第3章の最後にあるプロジェクトのガイドラインを使用して、Collat​​zプログラムを作成しようとしています。 python _3.4.0_。を使用しています。プロジェクトの概要は次のとおりです。

Numberという名前のパラメーターを1つ持つcollatz()という名前の関数を作成します。数が偶数の場合、collatz()は_number // 2_を出力し、この値を返します。数が奇数の場合、collatz()は印刷して_3 * number + 1_を返します。次に、ユーザーが整数を入力できるようにし、関数が値_1_を返すまで、その数値に対してcollatz()を呼び出し続けるプログラムを作成します。

このプログラムの出力は次のようになります。

_Enter number: 3 10 5 16 8 4 2 1 
_

Whileループ内でifおよびElifステートメントを使用する関数を作成しようとしています。数値を印刷してから、ループの先頭に戻り、Collat​​zシーケンスを使用して1つに減らします。結果の数値の各インスタンスは、ループを通過するときに印刷されます。現在のコードでは、番号の最初のインスタンスのみを印刷できますが、その番号はその後ループを通過しません。以下は私のコードです:

_#collatz

print("enter a number:")
try:
    number = (int(input()))
except ValueError:
          print("Please enter a valid INTEGER.")


def collatz(number):
    while number != 1:

        if number % 2==0:
            number = (number//2)
            #print(number)
            return (print(int(number)))

        Elif nnumber % 2==1:
            number = (3*number+1) 
            #print(number)
            return (print(int(number)))

        continue


collatz(number)
_
14
DeltaFlyer
def collatz(number):

    if number % 2 == 0:
        print(number // 2)
        return number // 2

    Elif number % 2 == 1:
        result = 3 * number + 1
        print(result)
        return result

n = input("Give me a number: ")
while n != 1:
    n = collatz(int(n))

出力:

Give me a number: 3
10
5
16
8
4
2
1

Give me a number: 11
34
17
52
26
13
40
20
10
5
16
8
4
2
1
19
Nuncjo

ここに私が思いついたものがあります:

import sys

def collatz(number):
    if number % 2 == 0:           # Even number
        result = number // 2
    Elif number % 2 == 1:         # Odd number
        result = 3 * number + 1

    while result == 1:            # It would not print the number 1 without this loop
        print(result)
        sys.exit()                # So 1 is not printed forever.

    while result != 1:            # Goes through this loop until the condition in the previous one is True.
        print(result)
        number = result           # This makes it so collatz() is called with the number it has previously evaluated down to.
        return collatz(number)    

print('Enter a number: ')         # Program starts here!
try:
    number = int(input())         # ERROR! if a text string or float is input.
    collatz(number)
except ValueError:
    print('You must enter an integer type.')

                                  # Fully working!
5
ubundows

collatz()関数は、次の値のみを出力して返す必要があります。 (戻ると終了します。)

whileループはcollatz()関数内にあるべきではありません。

また、一貫性のない変数名(nnumbernnumber)があり、いくつかの重要なコードがコメント化されています。

3
Jonathan Clede

私が思いついたのと同じエクササイズの17行のコード。

    def collatz(number):
    """ check if the number is even or odd and performs calculations.
    """
    if number % 2  == 0: # even
        print(number // 2)
        return number //2
    Elif number % 2 != 0: # odd 
        result = 3*number+1
        print(result)
        return result

try:
    n = input('Enter number: ') # takes user input
    while n !=1: # performs while loop until 'n' becomes 1
        n = collatz(int(n)) # passes 'n' to collatz() function until it arrives at '1'
except ValueError:
    print('Value Error. Please enter integer.')
2
Simas

Returnステートメントを使用せずに正しく処理し、関数内にwhileループをネストしました。

number=int(input('Enter number:\n'))

def collatz(number):

    while number !=1:
        if number% 2 == 0:
            number= number//2
            print(number)

        else:
           number=  3 * number + 1
           print(number)    


collatz(number)
0
DeafaltCoder
def collatz(number): 
    if number%2==0:    
        return number//2
    Elif number%2==1:
        return number*3+1
step=1 #counter variable for amusement and seeing how many steps for completion.
try: #in case of ValueError   
    number=int(input('Enter a Number for Collatz Sequencing:')) 
    while collatz(number)!=1:    
        print(collatz(number))
        number=int(collatz(number))
        if collatz(number)!=1: 
            print('Calculating step ' + str(step) + '.')
            step=step+1
        else:
            print ('Calculating step ' +str(step) + '.')
            print('1 Has Been Reached.')
except ValueError: 
     print('Enter an Integer please:')
0
Tossaire
def collatz(number):
    while number != 1:
        if number %2==0:
            number = number//2
            yield number
        Elif number %2 ==1:
            number=number*3 +1
            yield number

while True:
    try:
        for n in collatz(int(input('Enter number:'))):
            print(n)
        break
    except ValueError:
        print('Please enter an integer')

余分なwhile Trueループは、ユーザーが非整数を入力した後もプログラムが機能し続けるのに役立ちます。

0
zheng yang
def collatz(number):
    if number % 2 == 0:
        return number // 2
    Elif number % 2 == 1:
        return 3 * number + 1

try:
    chosenInt = int(input('Enter an integer greater than 1: '))

    while chosenInt < 2:
        print("Sorry, your number must be greater than 1.")
        chosenInt = int(input('Enter an integer greater than 1: '))

    print(chosenInt)

    while chosenInt != 1:
        chosenInt = collatz(chosenInt)
        print(chosenInt)

except ValueError:
    print('Sorry, you must enter an integer.')
0
Dylan

これが私の19行です。

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


number = 0
while number == 0:
    try:
        number = int(input('Please enter a number: '))
        if number == 0:
            print('Number must be an integer not equal to zero.')
        else:
            while True:
                number = collatz(number)
                print(number)
                if abs(number) == 1 or number == -5 or number == -17: 
                    break #Collatz seq ends/enters recurring loop when number hits -17, -5, -1 or 1
    except ValueError:
        print('Number must be an integer.')
0
toonarmycaptain

14行:

単純な「else」の代わりに「Elif number%2 == 1:」が必要な理由が分からないのですか?

def  collatz(number):
    while number != 1:
        if number %2 == 0:
            number = number/2
            print(number)
        else:
            number = 3*number+1
            print(number)
print('Enter a number')
try:
    number = (int(input()))
except ValueError:
          print("Please enter an INTEGER.")
collatz(number)
0
Mike K

このスレッドのすべてのソリューションには1つ欠けています。ユーザーが「1」を入力した場合、関数はCollat​​zシーケンスの計算を実行する必要があります。私の解決策:

def collatz(number):
    while number == 1:
        print("3 * " + str(number) + " + 1 = " + str(3*number+1))
        number = 3*number+1 ##this while loop only runs once if at all b/c at end of it the value of the variable is not equal to 1
    else:
        while number != 1:
            if number % 2 == 0:
                print(str(number) + ' // 2 = ' + str(number//2))
                number = number//2
            else:
                print("3 * " + str(number) + " + 1 = " + str(3*number+1))
                number = 3*number+1

 print('Please input any integer to begin the Collatz sequence.')

while True:
    try:
        number = int(input())
        collatz(number)
        break
    except ValueError:
        print('please enter an integer')
0
stevensonmt

私はトライを追加しましたが、これを除いて(休憩付き)

def collatz(number):
if number %2 == 0:
    print(number//2)
    return number//2
Elif number %2 == 1:
    print(3 * number + 1)
    return 3 * number + 1

n = input("Give me a number: ")

while n != 1:
    try:
        isinstance(n, int)
        n = collatz(int(n))
    except:
        print('Error: Invalid argument.')
        break
0
Flip Vermeersch

Nuncjoは、有効なソリューションを得ました。エラー処理のためにtryおよびexceptステートメントを追加するために少し調整しました。

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

    Elif number % 2 == 1:
        result = 3 * number + 1
        print(result)
        return result

try:
    n = input("Enter number: ")
    while n > 0 and n!= 1:
        n = collatz(int(n))
except ValueError:
    print('whoops, type an integer, bro.')
0
doc_gunthrop
def collatz(num): 
    if num % 2: 
        return 3 * num + 1
    else:
        return num // 2

while True:
    try:
    number = int(input('Enter a positive integer.'))  
    if number <= 0: 
        continue
    break
except ValueError: 
    continue


while number != 1:
    number = collatz(number)
    print(number)
0
Maecenas
import sys

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

Elif number % 2 == 1:
    result = number * 3 + 1
    print (result)

while result == 1:
    sys.exit

while result != 1:
    number = result
    collatz(number)

print ('Enter a number')

try:
    number = int(input())
    collatz(number)

except ValueError:
    print('Please enter a valid integer')
0
Subterranean
 def collat​​z(number):
 if(number%2 == 0):
 n = number // 2 
 print(n)
 return n 
 else:
 ev = 3 * number + 1 
 print(ev)
 return ev 
 num1 = input( "Enter a番号:\ n ")
 
 try:
 num = int(num1)
 if(num == 1):
 print(" 1 "より大きい整数を入力してください。)
 Elif(num> 1):
 a = collat​​z(num)
 while(True):
 if(a = = 1):
 break 
 else:
 a = collat​​z(a)
 else:
 print( "正整数を入力してください。 Collat​​zシーケンスの開始 ")
 
 except:
 print(" please、Enter a integer ")

退屈なものを自動化する機能の章までをベースにしたソリューションを考え出してみてください。 Collat​​z問題に関するヘルプが必要な場合は、こちらをご覧ください: http://mathworld.wolfram.com/Collat​​zProblem.html

0
Md. Raihan
def collatz(number):
    while number != 1:
        if number % 2 == 0:
            number = number // 2
            print(number)

        Elif number % 2 == 1:
            number = number * 3 + 1
            print(number)

try:
    num = int(input())
    collatz(num)
except ValueError:
    print('Please use whole numbers only.')

これは私自身が思いついたものであり、これまでこの本から学んだことだけに基づいています。少し時間がかかりましたが、使用したツールの1つは、解決策を見つけるのに非常に貴重であり、このコンテンツの学習にも非常に貴重でした。python視覚化ツール: http://www.pythontutor.com/visualize.html#mode=edit

私は自分のコードが何をしているのか、どこでハングアップしているのかを見ることができ、正しくなるまで継続的に微調整することができました。

0
Ryan Hallberg

このソリューションは、受け入れられているものよりも学習者にとってさらに簡単だと思います。

def collatzSequence(number):
    if (number % 2 == 0): # if it's even
        number = number // 2
    else:                 # if it's odd
        number = number * 3 + 1
    print (number)
    return (number)

n = int(input('Enter a number: '))
while (n != 1):
    n = collatzSequence(n)

結果は次のようになります。

Enter a number: 5
16
8
4
2
1
0
Noob

私は同じコースを読んでいて、非常に長い解決策を作成しました(何か新しいことを学んだときに改善します)。各章の進行に合わせて、collat​​zプログラムを最新の状態に保つことをお勧めします。その良いトレーニングです。私の文字列操作と\ collat​​zrecords.txtへの保存が可能になりました!

再帰を使用してコアの問題を解決しました(メソッドがそれ自体を呼び出します)。

def autocollatz(number):
global spam                     
spam.append(number)             
if number % 2 == 0:             
    autocollatz (int(number/2))
Elif number % 2 == 1 and number != 1:
    autocollatz(int(number*3+1))

スパムは、1に向かう途中で数字が「見る」すべての値の私のリストです。ご覧のように、数字が偶数の場合、ethodはnumber/2のaginと呼ばれます。番号が偶数の場合、number * 3 + 1で呼び出されます。

番号を変更== 1ビットをチェックします。私はそれが計算時間を節約することを願っています-すでに23 000 000までim! (現在の記録は15 733 191で、それを1にするための704ステップです)

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

    Elif number % 2 == 1:  # Odd number
        return number * 3 + 1

print('Please enter a number') # Ask for the number


# Check if the number is an integer, if so, see if even or odd. If not, rebuke and exit
try:
    number = int(input())
    while number != 1:
        collatz(number)
        print(number)
        number = collatz(number)
    else:
        print('You Win. The number is now 1!')
except ValueError:
     print('Please enter an integer')

これが、この練習問題で思いついたものです。入力を要求します。整数かどうかを検証します。そうでない場合は、非難して終了します。そうである場合、結果が1になるまでcollat​​zシーケンスをループしてから勝ちます。

0

マイコード

def collatz(number):
    while number != 1:
        if number % 2 == 0:
            print(number // 2)
            number = number // 2
        Elif number % 2 == 1:
            print(number * 3 + 1)
            number =  number *3 + 1

try:
    print ('Enter the number to Collatz:')
    collatz(int(input()))
except ValueError:
    print('Enter a valid integer')
0
Jebin
def collatz(number):
    if number % 2 == 0:
        print(number//2)
        return number // 2
    Elif number % 2 == 1:
        print(3*+number+1)
        return 3 * number + 1
r=''
print('Enter the number')
while r != int:
    try:
        r=input()
        while r != 1:
            r=collatz(int(r))
        break   
    except ValueError:
            print ('Please enter an integer')

入力検証を追加しました

0
LuckyMiv