python слегка модифицированная программа Collatz Conjecture

Мне дали задание написать программу гипотезы Коллатца, модифицированную следующим образом:

  1. Мы знаем, что программа ВСЕГДА делит на 4 четные числа, даже те, которые не делятся на 4, поэтому следующим шагом после 6 будет 6/4 == 1.
  2. Мы знаем, что программа всегда достигала состояния остановки даже при альтернативном поведении, но не уверены, было ли в коде другое изменение...

и это нужно

  1. подсчитайте количество шагов от n, пока мы не достигнем условия остановки
  2. вернуть сумму всех шагов в Shortz(n), включая сам n

как окончательный ответ, мне нужно вернуть (сумма всех шагов 737458374680773) * (количество шагов 98325112)

Проблема в том, что когда я вычисляю это: 737458374680773, оно входит в бесконечный цикл.

Что касается этой подсказки:

не уверен, что было другое изменение в коде...

Я не думаю, что мне нужно что-то менять в формуле нечетных чисел, потому что, на мой взгляд, это было бы слишком надуманным (но, эй, я мало что знаю, просветите меня :)).

Любые идеи относительно того, что проблема с моим кодом или что я не получил относительно задания?

Это мой код:

import math
def shortz(num):
    iterations = 0
    stepsSum = 0
    while( math.isnan(num) or num<0):
        num = int(input("Please supply a non-negative number ==>  "))
        print("")
    while(num !=1):
         if (num%2==0):
             num /= 4 
             stepsSum += num       
             print (str(iterations+1) + ") " + str(num))
         else:
             num = (num*3) -1
             print (str(iterations+1) + ") "+ str(num))
         iterations += 1 
         stepsSum += num
    print ("the number of iterations is " + str(iterations))
    print ("the sum of all steps is " + str(stepsSum))

q=0
while (q<1):
    x = int(input("Input positive number: "))
    shortz(x)
    z = str(input("Again?")).lower()
    if z[0]=='n':
        q=2

Большое спасибо!


person MatanyaP    schedule 13.06.2017    source источник


Ответы (1)


Ваша логика неправильно обрабатывает «2» и переходит в бесконечный цикл:

2/4 равно 0,5 -> (0,5 * 3) - 1 -> 0,5 -> (0,5 * 3) - 1 -> 0,5 и т. д.

Input positive number: 2
1) 0.5
2) 0.5
3) 0.5
4) 0.5
5) 0.5
6) 0.5
7) 0.5
...

Возможно, вам придется использовать num //= 4 вместо num /= 4, чтобы избавиться от дробной части. Но это не устраняет этот сбой, а просто изменяет повторяющийся результат с 0,5 на 0.

не уверен, что было другое изменение в коде...

Скорее всего относится к тому, как обращаться с нулем. Это не положительное целое число, поэтому он не является допустимым входом для shortz(), но он все равно появляется как внутренний результат (если вы используете //), и поэтому с ним нужно обращаться специально. (То же самое для 0,5, если вы продолжаете использовать /)

Возможно, что-то столь же простое, как изменение:

while(num !=1):

вместо этого быть:

while num > 1:

Это (наряду с использованием //) позволяет решить оба номера вашего примера.

person cdlane    schedule 13.06.2017
comment
Отличный анализ! (в моих глазах :) ) Я думаю, что это может быть, но будет известно только на следующей неделе. большое спасибо. - person MatanyaP; 13.06.2017