我最近开始学习Python。我正在课程的控制结构部分做一些练习,一切都很顺利,直到我难以理解最后一个问题。我现在已经看了三天了,我很确定解决方案很明显。以下是练习中的说明:
从任何数字开始。如果数字可被3整除,则除以3.否则,将数字加2。最终,无论你开始的是什么数字,这个系列都会遇到1.例如,想象我们从数字5:5开始不能被3整除,所以5 + 2 = 7 7不能被3整除,所以7 + 2 = 9 9可被3整除,因此9/3 = 3 3可被3整除,因此3/3 = 1
从5开始,该序列在4次迭代中收敛:5 - > 7,7 - > 9,9 - > 3,3 - > 1。
写一个叫做joyner的函数。 joyner应该有一个参数,一个整数。它应该返回第一次达到1所需的迭代次数。
我运行了我在一个用不同整数测试我的函数的页面上编写的函数。每次它给我一个错误(说明预期有多少迭代以及我的程序计算了多少)我设法修复了该整数的程序,但是下面测试的整数会再次给我一个错误。下面的代码是我决定来这里寻求帮助之前的最后重写。
def joyner(num):
count = 0
while num % 3 != 0:
# print("num not divisible by 3")
num = num + 2
# print("added 2")
count += 1
# print(count)
if num % 3 == 0:
# print("num is divisible by 3")
num /= 3
# print("divided by 3")
count += 1
# print(count)
while num % 3 == 0:
# print("num is divisible by 3")
num /= 3
# print("divided by 3")
count += 1
# print(count)
return count
结果如下:
我们发现您提交的内容存在以下问题:
我们用num = 15测试了你的代码。我们期望joyner返回int 5.但是,它返回了int 1。
我们用num = 29测试了你的代码。我们期望joyner返回int 10.但是,它返回了int 3。
我们用num = 65测试了你的代码。我们期望joyner返回int 8.但是,它返回了int 3。
我们用num = 12测试了你的代码。我们期望joyner返回int 3.但是,它返回了int 1。
我们用num = 32测试了你的代码。我们期望joyner返回int 6.但是,它返回了int 4。
请注意,这些错误可能会阻止我们以其他方式检查您的提交,因此修复这些问题可能会导致下次出现其他问题。继续尝试!这就是调试的全部内容。
您提交的内容如下:
我们希望在你的代码中找到一个名为joyner的函数,我们做到了。
我们用num = 5测试了你的代码。我们期望joyner返回int 4,它确实如此。
我们用num = 27测试了你的代码。我们期望joyner返回int 3,它确实如此。
我们用num = 16测试了你的代码。我们期望joyner返回int 3,它确实如此。
你的代码就是它假设当一个数字不再被3整除时它达到1,那就是你的第二个循环,例如15可以被3整除,它变成5,这是不可分的但也没有1。
总的来说就是这样,一个数字可以是可以整除的,也可以不是一个整数,所以它应该在一个循环中发生,你应该在达到1时停止。
你的任务的前提是不正确的:
从任何数字开始。如果数字可被3整除,则除以3.否则,将数字加2。最终,无论你开始的是什么数字,这个系列都会遇到1。
number = 4
4 + 2 = 6 # 4 is not divisible by 3, add 2
6 / 3 = 2 # 6 is divisible by 3 -> 2
2 + 2 = 4 # 2 is not divisible by 3, add 2
4 + 2 = 6 # 4 is not divisible by 3, add 2 --> cycle - no solution.
如果有解决方案,则会找到它:
def joyner(num):
count = 0
seen = set()
while num != 1:
if num in seen:
return None
else:
seen.add(num)
if num % 3 == 0:
num = num // 3
else:
num += 2
count += 1
return count
测试一下:
i = 0
for k,c in d.items():
if c is None:
continue
print(k,":",c, end=" ")
i += 1
if i % 6 == 0:
print()
i = 0
解决方案的输出从1到99:
1 : 0 3 : 1 5 : 4 7 : 3 9 : 2 11 : 7
13 : 6 15 : 5 17 : 6 19 : 5 21 : 4 23 : 5
25 : 4 27 : 3 29 : 10 31 : 9 33 : 8 35 : 9
37 : 8 39 : 7 41 : 8 43 : 7 45 : 6 47 : 9
49 : 8 51 : 7 53 : 8 55 : 7 57 : 6 59 : 7
61 : 6 63 : 5 65 : 8 67 : 7 69 : 6 71 : 7
73 : 6 75 : 5 77 : 6 79 : 5 81 : 4 83 : 13
85 : 12 87 : 11 89 : 12 91 : 11 93 : 10 95 : 11
97 : 10 99 : 9
不可行:
[ 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40,
42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78,
80, 82, 84, 86, 88, 90, 92, 94, 96, 98]
你的算法只适用于奇数。
我们用num = 12测试了你的代码。我们期望joyner返回int 3.但是,它返回了int 1。
根本不起作用