Использование функции while в последовательности Фибоначчи в R - PullRequest
0 голосов
/ 05 мая 2018

Я записал код Фибоначчи, но не могу получить функцию «Пока». Допустим, я увеличил последовательность до 34 вычислений, но мне нужны только результаты, которые не превышают 4 000 000. Вот код, который у меня есть (нижний просто для получения простых чисел).

#rm (list=ls())
len <- 34
fibvals <- numeric(len)
fibvals[1] <- 1
fibvals[2] <- 1

for (i in 3:len) { 
  fibvals[i] <- fibvals[i-1]+fibvals[i-2]
} 


fib.mat <- as.matrix(fibvals)
fib.mat[lapply(fib.mat, "%%", 2) == 0]
sum (fib.mat)

···········

Я пытался использовать такие коды, как этот, которые либо идут по бесконечному циклу, либо просто получают ошибку. Любая помощь будет оценена, спасибо!

while (fibvals < 4000000) {
  print(fibvals)
}

Ответы [ 3 ]

0 голосов
/ 05 мая 2018

Вы можете сделать следующее (учтите, что на моем ноутбуке это займет около 45 секунд):

# Fibonacci numbers using recursive relation
fib <- function(n) {
    val <- n;
    if (n > 1) val <- fib(n - 1) + fib(n - 2);
    return(val);
}

# Print Fibonacci numbers while < 4,000,0000
n <- 0;
while (fib(n) < 4000000) {
    print(fib(n));
    n <- n + 1;
}
#[1] 0
#[1] 1
#[1] 1
#[1] 2
#[1] 3
#[1] 5
#[1] 8
#[1] 13
#[1] 21
#[1] 34
#[1] 55
#[1] 89
#[1] 144
#[1] 233
#[1] 377
#[1] 610
#[1] 987
#[1] 1597
#[1] 2584
#[1] 4181
#[1] 6765
#[1] 10946
#[1] 17711
#[1] 28657
#[1] 46368
#[1] 75025
#[1] 121393
#[1] 196418
#[1] 317811
#[1] 514229
#[1] 832040
#[1] 1346269
#[1] 2178309
#[1] 3524578
0 голосов
/ 06 мая 2018

Вы можете использовать явную форму последовательности Фибоначчи

enter image description here

fibonacciR <- function(n){(((1+sqrt(5))/2)^(n)-(1-((1+sqrt(5))/2))^(n))/sqrt(5)}
#fibonacciR(0:30)
result<-n<-0
while(fibonacciR(n)<4000000){
result<-c(result,fibonacciR(n));
n<-n+1}
result[-1]
[1]       0       1       1       2       3       5       8      13      21      34      55      89     144
[14]     233     377     610     987    1597    2584    4181    6765   10946   17711   28657   46368   75025
[27]  121393  196418  317811  514229  832040 1346269 2178309 3524578

Это очень быстро, на моем компьютере это занимает менее секунды

0 голосов
/ 05 мая 2018

Он не зацикливает значения fibvals так, как вы его кодировали (вы передаете вектор значений ИСТИНА / ЛОЖЬ в while). Например, вы используете переменную вспомогательного счетчика, например:

counter <- 1
while (fibvals[counter] < 4000000) {
  print(fibvals[counter])
  counter <- counter + 1
}

Это дает желаемый результат, как я понял.

...