Я заинтересован в создании функции, которая бы обеспечивала длину последовательности Колатца. Для этого я использую функцию повтора, чтобы пройти последовательность. Однако, кажется, что функция повтора не останавливает вычисление значений.
Что такое последовательность Коллатца
Последовательность Коллатца принимает число (назовите его n
) ипроверяет, является ли оно четным или нечетным. Если оно четное, то число делится на 2 (n<-n/2
). Если это нечетно, то число делится на 3n + 1 (n<-(3n+1)
). Он заканчивается, когда число равно 1 (когда n = 1).
Изначально я думал, что функция повтора не работает просто из-за проблемы с плавающей запятой / целочисленным значением. Поэтому я добавил isTRUE(all.equal(...))
, как советовали здесь . Это не решило проблему.
Полагаю, ошибка в моей логике. Однако я не могу его найти.
Код
colatzSeq<-function(n){
tempVar<-n
count<-1
repeat{
if(isTRUE(all.equal(tempVar%%2,0))){
tempVar<-tempVar/2
}else{
if(isTRUE(all.equal(tempVar,1))){
tempVar<-1
}else{
tempVar<-tempVar/(3*tempVar+1)
}
}
count<-count+1
if(isTRUE(all.equal(tempVar,1))){
print(count)
break
}
}
}
Код, который должен возвращать количество элементов в последовательности. Например, colatzSeq(20)
должно возвращать 8 (это означает, что потребовалось 7 раз, чтобы изменить число 20, чтобы получить 1 в соответствии с последовательностью Коллатца).
Как упоминалось выше, ошибки нет. Просто бесконечное деление.
Спасибо!