为了账号安全,请及时绑定邮箱和手机立即绑定

无法获得用于计算迭代次数的 Python 函数以使其正常工作

无法获得用于计算迭代次数的 Python 函数以使其正常工作

SMILET 2022-01-05 11:25:37
我最近开始学习 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 次迭代中收敛于 1: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,并且确实如此。
查看完整描述

2 回答

?
LEATH

TA贡献1936条经验 获得超7个赞

你的任务前提不正确:


从任何数字开始。如果这个数能被 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。


不工作在所有


查看完整回答
反对 回复 2022-01-05
?
米脂

TA贡献1836条经验 获得超3个赞

你的代码的事情是它假设当一个数字不再能被 3 整除时它达到 1,那就是关于你的第二个循环,例如 15 可以被 3 整除,它变成 5,它不能被整除,但也不能被整除1.

总体上这样想,一个数可能是可整除的,也可能是不可整除的,所以它应该在一个循环中发生,当你达到1时你应该停止。


查看完整回答
反对 回复 2022-01-05
  • 2 回答
  • 0 关注
  • 177 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号