Почему мой код последовательности Коллатца выполняется, но показывает ошибку?

Одна работа заключается в том, чтобы переместить положение фона, чтобы эффект изменения градиента: http://sapphion.com/2011/10/css3-gradient-transition-with-background-position/

Переход градиента CSS3 с фоновой позицией

Хотя вы не можете напрямую изменять градиенты с использованием свойства перехода CSS, можно анимировать фоновый рисунок, position для достижения простой градиентной анимации:

Код для этого прост:

#DemoGradient{  
    background: -webkit-linear-gradient(#C7D3DC,#5B798E);  
    background: -moz-linear-gradient(#C7D3DC,#5B798E);  
    background: -o-linear-gradient(#C7D3DC,#5B798E);  
    background: linear-gradient(#C7D3DC,#5B798E);  
  
    -webkit-transition: background 1s ease-out;  
    -moz-transition: background 1s ease-out;  
    -o-transition: background 1s ease-out;  
    transition: background 1s ease-out;  
  
    background-size:1px 200px;  
    border-radius: 10px;  
    border: 1px solid #839DB0;  
    cursor:pointer;  
    width: 150px;  
    height: 100px;  
}  
#DemoGradient:Hover{  
    background-position:100px;  
}  

0
задан Riptide 17 January 2019 в 13:32
поделиться

1 ответ

Вы делаете a = collatz(a), но так как ваша функция не имеет операторов возврата, это устанавливает a в Нет. Затем в следующей итерации цикла вы попытаетесь выполнить арифметику для a. Это терпит неудачу, потому что вы не можете делать арифметику None.

Тебе вообще не нужна рекурсия. У вас уже есть цикл, так что вы можете просто удалить эти коллатц-вызовы.

def collatz(a):
    while (a != 1):

        if a%2 == 0:
            a = a//2
            print (a, " -> ")
        elif a%2 != 0:
            a = int(3*a + 1)
            print (a, " -> ")


x = int(input("Enter a number: "))
collatz(x)

... Но если у вас нет шансов на рекурсию, вы тоже можете это сделать. Удалите цикл while и вызовите collatz в конце вашей функции.

def collatz(a):
    if a == 1:
        return
    if a%2 == 0:
        a = a//2
    elif a%2 != 0:
        a = int(3*a + 1)
    print (a, " -> ")
    collatz(a)

Недостаток этого подхода заключается в том, что он будет аварийно завершать работу с «превышением максимальной глубины рекурсии», если функция повторяется более 999 раз. Последовательности Коллатца сходятся к 1 довольно быстро, так что это, вероятно, не является практической проблемой для этого конкретного алгоритма, но об этом следует помнить при написании любой рекурсивной функции.


Оба эти подхода имеют потенциально нежелательное поведение печати «->» после последнего номера в последовательности. Это довольно распространенная проблема в этом стиле кода «печать во время итерации». Одно из возможных решений - удалить вызовы печати из функции, вместо этого возвращая список значений последовательности. Затем вы можете оформить вывод после факта, используя join, чтобы перемежать числа стрелками.

def collatz(a):
    result = [a]
    while (a != 1):

        if a%2 == 0:
            a = a//2
        elif a%2 != 0:
            a = int(3*a + 1)
        result.append(a)
    return result

x = int(input("Enter a number: "))
seq = collatz(x)
print(" -> ".join(str(num) for num in seq))
0
ответ дан Kevin 17 January 2019 в 13:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: