Числа Фибоначчи без рекурсии

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
hCORe
VB - Экстремал
VB - Экстремал
Аватара пользователя
 
Сообщения: 2332
Зарегистрирован: 22.02.2003 (Сб) 15:21
Откуда: parent directory

Числа Фибоначчи без рекурсии

Сообщение hCORe » 02.09.2004 (Чт) 18:48

Итак, мне поставлена была задача - написать функцию для обсчета чисел Фибоначчи в интервале от 2 до 100.
Кто не знает - число ряда Фибоначчи выражается функцией F(x)=F(x-1)+F(x-2). F(0)=0, F(1)=1.

Написал простейшее решение - через рекурсивную функцию:
Код: Выделить всё
Public Function Fib(Nmb As Long) As Long
    If Nmb = 0 Then Fib = 0: Exit Function
    If Nmb = 1 Then Fib = 1: Exit Function
    Nmb = Fib(Nmb - 1) + Fib(Nmb - 2)
    Fib = Nmb
End Function


Но - при значениях >10 работает ужасно медленно. А мне надо до сотни :twisted:

Один спец просветил, что здесь лучше использовать циклы, они во много раз быстрее. Но как? Кто подскажет, тому пирожок с полки. Вкусный, его крысы не доели :P
Моду создают модоки, а распространяют модозвоны.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 02.09.2004 (Чт) 19:15

Вот тебе универсальная формула...

Fib(n) = (1/sqr(n))*(((1+sqr(5))/2)^n-((1-sqr(5))/2)^n)


Ну и для самых ленивых... http://www.everyday.com.ua/digilet/fibonacci.htm :wink:
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

hCORe
VB - Экстремал
VB - Экстремал
Аватара пользователя
 
Сообщения: 2332
Зарегистрирован: 22.02.2003 (Сб) 15:21
Откуда: parent directory

Сообщение hCORe » 02.09.2004 (Чт) 19:27

А мне больше вот этот вариант понравился. Он и короче, и проще:

Код: Выделить всё
Private Function Fib(Nmb As Long) As Double
    If Nmb = 0 Then Fib = 0: Exit Function
    If Nmb = 1 Then Fib = 1: Exit Function
    Fib = Round((1.6180339 ^ Nmb - 0.6180339 ^ Nmb) / _
    2.236067977, 0)
End Function
Моду создают модоки, а распространяют модозвоны.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 02.09.2004 (Чт) 19:42

Так это, батенька, оно и есть :)
Прсто корни уже посчитаны. А я тебе, так сказать, в оригинале :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 02.09.2004 (Чт) 20:26

Вот цикл, если ещё надо:
Код: Выделить всё
Option Explicit

Sub Main()
Dim i As Long
For i = 1 To 10: Debug.Print i, f(i): Next
End Sub

Function f(ByVal i As Integer) As Long
Dim s0 As Long, s1 As Long, s As Long, j As Integer
If i = 0 Then f = 0: Exit Function
s0 = 1
For j = 1 To i
    s = s1 + s0
    s0 = s1
    s1 = s
Next
f = s
End Function
Изображение

MOV
Постоялец
Постоялец
 
Сообщения: 414
Зарегистрирован: 13.03.2004 (Сб) 15:13
Откуда: Санкт-Петербург

Сообщение MOV » 03.09.2004 (Пт) 17:59

Или так :D :

Код: Выделить всё
Dim f(100) As Double
f(1) = 1
For i = 0 To 100
On Error Resume Next
f(i) = f(i - 1) + f(i - 2)
Debug.Print i & " - " & f(i)
Next


Дикое извращение и нерациональное из-за массива, зато быстро и понятно до безобразия :D , а формулой, кончено, тоже здорово.

hCORe
VB - Экстремал
VB - Экстремал
Аватара пользователя
 
Сообщения: 2332
Зарегистрирован: 22.02.2003 (Сб) 15:21
Откуда: parent directory

Сообщение hCORe » 03.09.2004 (Пт) 20:24

Спасибо за новые решения. Не думал что эта проблема так популярна 8)
Моду создают модоки, а распространяют модозвоны.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: SemrushBot и гости: 2

    TopList