无法获得Python函数来计算迭代次数以正常工作

问题描述 投票:-1回答:2

我最近开始学习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,它确实如此。

python function loops conditional
2个回答
0
投票

你的代码就是它假设当一个数字不再被3整除时它达到1,那就是你的第二个循环,例如15可以被3整除,它变成5,这是不可分的但也没有1。

总的来说就是这样,一个数字可以是可以整除的,也可以不是一个整数,所以它应该在一个循环中发生,你应该在达到1时停止。


0
投票

你的任务的前提是不正确的:

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

根本不起作用

© www.soinside.com 2019 - 2024. All rights reserved.