2014-11-25 3 views
0

Я новичок в программировании и я пытался Project Euler, чтобы узнать больше о Р.Проект Эйлера # 2 в R

Вопрос, который топала меня выглядит следующим образом:

Каждый новый член в последовательности Фибоначчи генерируется добавлением предыдущих двух членов. Начиная с 1 и 2, первые 10 условия будут:

1, 2, 3, 5, 8, 13, 21, 34, 55, 89

Рассматривая термины в последовательности Фибоначчи, чьи значения не превышают 4 миллиона, найдите сумму четных членов.

Я начал решать эту проблему, установив первые пары цифр в последовательности:

num <- c(1, 2) 

Далее я пытаюсь создать функцию fib(), которая будет суммировать последние два числа в num и добавьте их к вектору.

Моя первая попытка была сделать следующее:

num <- c(1, 2) 

fib <- function(x) { 
    sum <- sum(tail(x,2)) 
     while (sum <= 4e6) { 
     x <- append(x, sum) 
     return(x) 
    } 
} 

Но когда я запускаю это я только один дополнительный номер Фибоначчи:

> fib(num) 
[1] 1 2 3 

В свою очередь, я попытался скользящую return(x):

num <- c(1, 2) 

fib <- function(x) { 
    sum <- sum(tail(x,2)) 
     while (sum <= 4e6) { 
     x <- append(x, sum) 
    } 
    return(x) 
} 

Но это, по-видимому, создает только бесконечный цикл.

Как предостережение, мне удобно суммировать четные термины с модулем, и я сделаю это после того, как я выработаю эту конкретную проблему.

Можете ли вы указать, где я ошибаюсь в своем коде? (Если бы вы могли дать мне удар в правильном направлении без предоставления явного решения, которое было бы еще более оценено.)

Благодаря @Minnow и @blakeoft за то, что помогли мне разобраться с этим. Вот то, что я в конечном итоге делает, чтобы решить эту проблему:

Спойлер ALERT

num <- c(1, 2) 

fib <- function(x) { 
    last2 <- sum(tail(x,2)) 
      while (last2 <= 4000000) { 
       x <- append(x, last2) 
       last2 <- sum(tail(x,2)) 
      } 
    return(x) 
} 

я не буду включать последний бит с по модулю, так как я хочу, чтобы держать ответ специфичен для первоначального вопроса.

ответ

2

Не давая его прочь:

Прогулка через петлю и посмотреть, если вы можете выяснить, ожидаемый результат. Вы близки, но последовательность событий не даст то, что вы ожидаете.

+1

Дополнительный намек: в конце каждой итерации цикла обратите внимание на то, что произошло с каждой из переменных. Всего объявлено 3, а именно 'num',' sum' и 'x'. – blakeoft

+0

Этот комментарий был удар, в котором я нуждался, спасибо. –

2

Является ли это проблемой, специфичной для языка? Вам действительно не нужна функция, всего три переменные: prev, curr и next. Предварительно загрузите первые два и запишите сумму четных значений. Вы знаете, как установить значение next, затем обработайте его и запишите значения обратно в свою историю.

Вам не нужен конкретный ответ, но теперь вы его приняли, это то, что я имел в виду - это не r, но он показывает, насколько это просто.

int sum = 2; 
int prev = 1; 
int curr = 2; 
int next = 0; 
while (next < 4000000) { 
    next = prev + curr; 
    if (next % 2 == 0) 
     sum += next; 
    prev = curr; 
    curr = next; 
} 
printf ("%d", sum); 
+0

Спасибо за помощь в этом, но я не понимаю, как засунуть их в историю без цикла. –

+1

Я расширил свой ответ, теперь ваш фактический вопрос был удовлетворен. –

+0

Прохладный, я никогда не видел этот подход, прежде чем поблагодарить вас за то, что вы его поделились. Я собираюсь проголосовать за этот ответ в течение нескольких часов после того, как у меня снова есть голоса. –