Невозможно получить функцию Python для вычисления количества итераций для правильной работы - PullRequest
0 голосов
/ 09 апреля 2019

Я недавно начал изучать 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, эта последовательность сходится на 1 в 4 итерациях: 5 ->7, 7 -> 9, 9 -> 3, 3 -> 1.

Напишите функцию под названием 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. Мы ожидали, что joynerreturn int 6. Однако он вернул int 4.

Обратите внимание, что эти ошибки могли помешать нам проверить вашу отправку другими способами, поэтому исправление этих проблем может вызвать появление других проблем в следующий раз.Продолжай пытаться!Именно в этом и заключается отладка.


Следующие вещи были верны в вашем представлении:

Мы ожидали найти функцию с именем joyner в вашем коде, и мы это сделали.

Мы протестировали ваш код с num = 5. Мы ожидали, что joyner вернет int 4, и он это сделал.

Мы протестировали ваш код с num = 27. Мы ожидали, что joyner вернет int 3,и он это сделал.

Мы протестировали ваш код с num = 16. Мы ожидали, что joyner вернет int 3, и он это сделал.

Ответы [ 2 ]

0 голосов
/ 09 апреля 2019

Предпосылка вашей задачи неверна:

Начните с любого числа.Если число делится на 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.

не работает на все

0 голосов
/ 09 апреля 2019

Дело в том, что ваш код предполагает, что когда число больше не делится на 3, оно достигает 1, что касается вашего второго цикла, например, 15 делится на 3, становится 5, что не делится но тоже не 1.

В общем, думайте об этом следующим образом: число может быть делимым или не сразу, поэтому это должно происходить за один цикл, и вы должны остановиться, когда достигнете 1.

...