Функция повтора не останавливается в R - PullRequest
0 голосов
/ 16 октября 2019

Я заинтересован в создании функции, которая бы обеспечивала длину последовательности Колатца. Для этого я использую функцию повтора, чтобы пройти последовательность. Однако, кажется, что функция повтора не останавливает вычисление значений.

Что такое последовательность Коллатца

Последовательность Коллатца принимает число (назовите его 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 в соответствии с последовательностью Коллатца).

Как упоминалось выше, ошибки нет. Просто бесконечное деление.

Спасибо!

Ответы [ 2 ]

1 голос
/ 16 октября 2019

Исправление определения в вопросе согласно https://en.wikipedia.org/wiki/Collatz_conjecture и улучшение имеющегося у нас кода:

collatzSeq<-function(n) {
  N <- n
  while(n != 1) {
    n <- if (n %% 2 == 0) n/2 else 3*n + 1
    N <- c(N, n)
  }
  N
}

collatzSeq(20)
## [1] 20 10  5 16  8  4  2  1
0 голосов
/ 16 октября 2019

Оказывается, я неправильно понял определение. Нечетные числа заменяются на 3n+1, а не n/(3n+1). В остальном работает нормально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...