LINUX.ORG.RU

можно и без рекурсии
используй static и один параметр для сброса статической переменной
int get_next_fibo(bool start)
{
  static int fibo;
  if(start)
    fibo=0;
  /*
   * алгоритм
   */
  return fibo
}

goodwin ★★
()

Так, ради смеха ...

typedef unsigned int uint;

template <uint n> inline uint fib() { return fib<n-1>() + fib<n-2>(); }

template <> inline uint fib<1> () { return 1; }

template <> inline uint fib<0> () { return 1; }

int main() { std::cout<<fib<4>()<<std::endl; };

ukez
()

изврат на лиспе с lexical closure :_)

(defun fibgen ()
  (let ((fn-1 0) (fn-2 0) (fn 1)) #'(lambda ()
				      (setq fn-2 fn-1)
				      (setq fn-1 fn)
				      (setq fn (+ fn-1 fn-2)))))

human0id ★★★
()
Ответ на: комментарий от goodwin

> используй static и один параметр для сброса статической переменной

Угу, и потом долго матюгайся, когда вызовешь это из двух потоков сразу.

int19h ★★★★
()
Ответ на: комментарий от human0id

> fib n = fib(n-1)+fib(n-2)

Это очень шустро сожрет стек, т.к. не имеем tail recursion, которую компилятор мог бы соптимизировать.

int19h ★★★★
()
Ответ на: комментарий от int19h

>>используй static и один параметр для сброса статической переменной
>Угу, и потом долго матюгайся, когда вызовешь это из двух потоков сразу.
ну, я так далеко не загадывал :)

goodwin ★★
()
Ответ на: комментарий от int19h

В этом и заключается смысл! Берем задачу которая имеет сложность n и дико извращаясь придумываем для ее вычисления алгоритм сложности n! затем ище раз извращаемся придумываем хвостовую рекурсию в результате решение снова имеет сложность n и это теперь является доказательством крутости некоторого семейства языков.

ddf6f8a0a979b974d9e1dd8ea307c4db
()
Ответ на: комментарий от ddf6f8a0a979b974d9e1dd8ea307c4db

Это хорошо, наверное, что господин Д. Кнут не знает русского арго, а то бы он вам показал: число Фибоначи и алгоритм вычисления факториала--классический пример, когда не надо использовать рекурсию!

Unforgiven
()
Ответ на: комментарий от mikhail

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

это не константное время, это обман. Формула требует растущей точности флоатов.

dilmah ★★★★★
()

У меня так:

int calcfibc (int n, int a=1, int b=0)
{
    if (n<=1) return a;
    return calcfibc (n-1, a+b, a);
};

unDEFER ★★★★★
()

Используя вот это тождество для матриц 2x2

(F_{n+1}, F_n; F_n, F_{n-1}) = (1,1; 1,0)^n

и рекурсивный алгоритм для вычисления a^n, получаем
алгоритм, работающий за время O(log n)

grob ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.