7

コラッツの予想

私がやろうとしていること:開始整数を受け取り、その数の開始点を含む整数のシーケンスを返す、collat​​z_sequenceと呼ばれる関数を記述します。シーケンスをリストの形式で返します。ユーザーが1未満の整数を入力した場合に、空のリスト[]を返すように関数を作成します。

コラッツ予想の背景:

任意の自然数nを取ります。nが偶数の場合は2で割ってn/2を求め、nが奇数の場合は3を掛けて1を足し、3n+1を求めます。このプロセスを無期限に繰り返します。推測では、どの番号から始めても、最終的には常に1に到達します。

私がこれまでに持っているもの:

def collatz_sequence(x):
    seq = [x]
    if x < 1:
       return []
    while x > 1:
       if x % 2 == 0:
         x= x/2
       else:
         x= 3*x+1 
    return seq

これを1未満の数で実行すると、正しい空のセットが得られます。しかし、1より大きい数で実行すると、その数しか得られません。つまり、collat​​z_sequence(6)は[6]を返します。数列全体を返すためにこれが必要なので、6はリスト内の6,3,10,5,16,8,4,2,1を返す必要があります。

4

11 に答える 11

12

xリストに値を追加するのを忘れましたseq

def collatz_sequence(x):
    seq = [x]
    if x < 1:
       return []
    while x > 1:
       if x % 2 == 0:
         x = x / 2
       else:
         x = 3 * x + 1 
       seq.append(x)    # Added line
    return seq

検証:

~/tmp$ python collatz.py 
[6, 3, 10, 5, 16, 8, 4, 2, 1]
于 2012-11-13T18:52:12.213 に答える
5
def collatz_sequence(x):
    seq = [x]
    while seq[-1] > 1:
       if x % 2 == 0:
         seq.append(x/2)
       else:
         seq.append(3*x+1)
       x = seq[-1]
    return seq

これがあなたが探しているものを生み出すいくつかのコードです。チェック1はwhileステートメントに組み込まれており、リストに繰り返し追加されますseq

>>> collatz_sequence(6)
[6, 3, 10, 5, 16, 8, 4, 2, 1]

数字のリストが大きい場合、これは非常に遅くなることに注意してください。キャッシュは速度の問題を解決せず、プロジェクトオイラーの問題の強引な解決策でこれを使用することはできません。これは永遠にかかります(すべての計算、すべての反復を行うため)。

于 2012-11-13T19:39:55.780 に答える
0

これを行う別の方法は次のとおりです。

while True:
 x=int(input('ENTER NO.:'))
 print ('----------------')
 while x>0:
  if x%2==0:
   x = x/2
  elif x>1:
   x = 3*x + 1
  else:
   break
   print (x)

これにより、ユーザーは、終了するまで何度も番号を入力するように求められます。

于 2016-09-10T11:36:38.570 に答える
0
def collatz(x):
    while x !=1:
        print(int(x))
        if x%2 == 0:
            x = x/2
        else:
            x = 3*x+1

これが私が提案するものです。

于 2016-10-02T10:21:07.647 に答える
0
seq = []
x = (int(input("Add number:")))
if (x != 1):
   print ("Number can't be 1")
while x > 1:
    if x % 2 == 0:
        x=x/2
    else:
        x = 3 * x + 1
    seq.append (x)
print seq
于 2017-08-01T02:09:19.280 に答える
0

これにより、単一の数値のすべてのステップが得られます。0.3秒で50桁の数字で動作しました。

collatz = []

def collatz_sequence(x):
    while x != 1:
        if x % 2 == 0:
            x /= 2
        else:
            x = (3*x + 1)/2
        collatz.append(int(x))

    print(collatz)

collatz_sequence()
于 2020-01-21T18:30:33.587 に答える
0

再帰:

def collatz(n):
    if n == 1: return [n]
    elif n % 2 == 0: return [n] + collatz(int(n/2))
    else: return [n] + collatz(n*3+1)

print(collatz(27))
于 2020-04-16T04:53:38.397 に答える
0
steps=0
c0 = int(input("enter the value of c0="))

while c0>1:
    if c0 % 2 ==0 :
        c0 = c0/2
        print(int(c0))
        steps +=1
    else:
        c0 = (3 * c0) + 1
        print(int(c0))
        steps +=1
print("steps= ", steps)
于 2021-01-05T13:24:09.333 に答える
0
import numpy as np
from matplotlib.pyplot import step, xlim, ylim, show

def collatz_sequence(N):  
  seq = [N]
  m = 0
  maxN = 0
  while seq[-1] > 1:
     if N % 2 == 0:
       k = N//2
       seq.append(N//2)
       if k > maxN:
         maxN = k
     else:
       k = 3*N+1
       seq.append(3*N+1)
       if k > maxN:
         maxN = k
     N = seq[-1]
     m = m + 1
  print(seq)

  x = np.arange(0, m+1)
  y = np.array(seq)
  xlim(0, m+1)
  ylim(0, maxN*1.1)
  step(x, y)
  show()

def collatz_exec():
  print('Enter an Integer')
  N = int(input())
  collatz_sequence(N)

これがあなたがそれを使うことができる方法です:

>>> from collatz_sequence import *
>>> collatz_exec()
Enter an Integer
21
[21, 64, 32, 16, 8, 4, 2, 1]

そして、シーケンスを示すプロット:

ここに画像の説明を入力してください

于 2022-02-27T18:02:35.500 に答える
-1
seq = []

def collatz_sequence(x):
    global seq
    seq.append(x)
    if x == 1:
        return 
    if (x % 2) == 0:
        collatz_sequence(x / 2)
    else:
        collatz_sequence((x * 3) + 1)

collatz_sequence(217)
print seq
于 2015-06-20T19:50:10.427 に答える
-1
def collataz(number):
    while number > 1:
        if number % 2 == 0 :
            number = number //2
            print(number)
        elif number % 2 ==1 :
            number = 3 * number + 1
            print(number)
        if number == 1 :
            break

print('enter any number...!')
number=int(input())
collataz(number)
于 2015-09-23T05:46:56.187 に答える