帮助!我是一名Python初学者,已完成从用户输入的整数显示Collatz序列,并在列和行中显示内容的任务。您可能知道,结果可能是10个数字,30个或100。我应该使用'\ t'。我尝试了许多变体,但充其量只能得到一栏。例如
def sequence(number):
if number % 2 == 0:
return number // 2
else:
result = number * 3 + 1
return result
n = int(input('Enter any positive integer to see Collatz Sequence:\n'))
while sequence != 1:
n = sequence(int(n))
print('%s\t' % n)
if n == 1:
print('\nThank you! The number 1 is the end of the Collatz Sequence')
break
将产生单个垂直列,而不是水平显示结果。理想情况下,我想从左到右显示10个结果,然后转到另一行。感谢您的任何想法!
可能是这样:
def get_collatz(n):
return [n // 2, n * 3 + 1][n % 2]
while True:
user_input = input("Enter a positive integer: ")
try:
n = int(user_input)
assert n > 1
except (ValueError, AssertionError):
continue
else:
break
sequence = [n]
while True:
last_item = sequence[-1]
if last_item == 1:
break
sequence.append(get_collatz(last_item))
print(*sequence, sep="\t")
输出:
Enter a positive integer: 12
12 6 3 10 5 16 8 4 2 1
>>>
EDIT尝试使其与您的代码相似:
我会将您的sequence
函数更改为这样的内容:
def get_collatz(n):
if n % 2 == 0:
return n // 2
return n * 3 + 1
我之所以称它为get_collatz
,是因为我认为它比sequence
更具有描述性,但它仍然不是一个好名字-如果您想get_collatz_at_n
或诸如此类的字眼,可以很明确。
注意,由于不需要,我完全将else分支取出。如果为n % 2 == 0
,则我们从函数中返回,因此您可以在if
的正文中返回,也可以在下面返回一行-无需else
。
对于其余的,也许:
last_number = int(input("Enter a positive integer: "))
while last_number != 1:
print(last_number, end="\t")
last_number = get_collatz(last_number)
在Python中,print
有一个名为end
的可选关键字参数,默认情况下为\n
。它表示在打印语句的最后应该打印哪个字符。只需将其更改为\t
,就可以在一行上打印所有序列元素,并用制表符分隔(因为序列中的每个数字都调用单独的打印语句)。
但是,使用这种方法,您必须确保在1
循环结束后打印尾随的while
,因为一旦last_number
变为1
,循环就会终止。循环将没有机会打印它。
打印序列的另一种方法(带有分隔标签)是将序列存储在列表中,然后使用str.join
从列表中创建一个字符串,其中每个元素由某个字符串或字符分隔。当然,这需要列表中的所有元素都以字符串开头-在这种情况下,我使用map
将整数转换为字符串:
result = "\t".join(map(str, [12, 6, 3, 10, 5, 16, 8, 4, 2, 1]))
print(result)
输出:
12 6 3 10 5 16 8 4 2 1
>>>