Pythonで退屈なものを自動化するの第3章の最後にあるプロジェクトのガイドラインを使用して、Collatzプログラムを作成しようとしています。 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
ステートメントを使用する関数を作成しようとしています。数値を印刷してから、ループの先頭に戻り、Collatzシーケンスを使用して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)
_
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
ここに私が思いついたものがあります:
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!
collatz()
関数は、次の値のみを出力して返す必要があります。 (戻ると終了します。)
while
ループはcollatz()
関数内にあるべきではありません。
また、一貫性のない変数名(n
、number
、nnumber
)があり、いくつかの重要なコードがコメント化されています。
私が思いついたのと同じエクササイズの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.')
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)
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:')
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ループは、ユーザーが非整数を入力した後もプログラムが機能し続けるのに役立ちます。
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.')
これが私の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.')
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)
このスレッドのすべてのソリューションには1つ欠けています。ユーザーが「1」を入力した場合、関数はCollatzシーケンスの計算を実行する必要があります。私の解決策:
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')
私はトライを追加しましたが、これを除いて(休憩付き)
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
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.')
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)
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')
def collatz(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 = collatz(num) while(True): if(a = = 1): break else: a = collatz(a) else: print( "正整数を入力してください。 Collatzシーケンスの開始 ") except: print(" please、Enter a integer ")
退屈なものを自動化する機能の章までをベースにしたソリューションを考え出してみてください。 Collatz問題に関するヘルプが必要な場合は、こちらをご覧ください: http://mathworld.wolfram.com/CollatzProblem.html
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
私は自分のコードが何をしているのか、どこでハングアップしているのかを見ることができ、正しくなるまで継続的に微調整することができました。
このソリューションは、受け入れられているものよりも学習者にとってさらに簡単だと思います。
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
私は同じコースを読んでいて、非常に長い解決策を作成しました(何か新しいことを学んだときに改善します)。各章の進行に合わせて、collatzプログラムを最新の状態に保つことをお勧めします。その良いトレーニングです。私の文字列操作と\ collatzrecords.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ステップです)
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になるまでcollatzシーケンスをループしてから勝ちます。
マイコード
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')
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')
入力検証を追加しました