Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.12.23;
Скачать: [xml.tar.bz2];

Вниз

Числа Фибоначчи и рекурсия   Найти похожие ветки 

 
Sonia ©   (2007-11-25 20:33) [0]

Всем привет!
Подскажите, пожалуйста, можно ли реализовать рекурсивно нахождение опрееленного числа (например, первое больше 1000) из ряда Фибоначчи?
f0=f1=1; fn=fn-1 + fn-2, при n>=2
Если можно, то как тогда в процессе выполнения рекурсии узнать предыдущие 2 числа?


 
@!!ex ©   (2007-11-25 20:39) [1]

> [0] Sonia ©   (25.11.07 20:33)

Видимо ты плохо понимаешь рекурсию, раз такие вопросы задаешь..


 
@!!ex ©   (2007-11-25 20:40) [2]

function Fibonachi(n:integer):integer;
begin
 if (n=0) or (n=1) then
   Result:=1
 else
   Result:=Fibonachi(n-1)+Fibonachi(n-2);
end;


 
@!!ex ©   (2007-11-25 20:42) [3]

Лучше всетаки dword, а не integer.
Чтобы какой нить умник не привел к переполнению call стэка вызовом с отричательным числом.
function Fibonachi(n:dword):dword;
begin
if (n=0) or (n=1) then
  Result:=1
else
  Result:=Fibonachi(n-1)+Fibonachi(n-2);
end;


 
DrPass ©   (2007-11-25 20:43) [4]


> @!!ex ©   (25.11.07 20:39) [1]

Ну и найди со своей рекурсивной функцией первое число больше 1000 (n ведь неизвестно!), раз такой умный
:)


 
@!!ex ©   (2007-11-25 20:58) [5]

> [4] DrPass ©   (25.11.07 20:43)

Как спрошено, так и отвечено.  ;)
Я бы это вообще без рексурсии решал.


 
DrPass ©   (2007-11-25 21:28) [6]


> @!!ex ©   (25.11.07 20:58) [5]

Дык ведь...

> можно ли реализовать рекурсивно нахождение опрееленного
> числа (например, первое больше 1000) из ряда Фибоначчи?

Кстати, действительно решается банальным циклом, а не рекурсией


 
Sonia ©   (2007-11-25 21:30) [7]

Меня несколько обидел ваш ответ:

> Видимо ты плохо понимаешь рекурсию, раз такие вопросы задаешь.

А по сему:
1) как вы думаете, задавала бы я вопросы, если бы хорошо знала рекурсию?


> Как спрошено, так и отвечено.  ;)


2) Спросила я нормально:

нахождение определенного числа (например, первое больше 1000) из ряда Фибоначчи?

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

По теме:

@!!ex ©   (25.11.07 20:42) [3]

Если использовать номер члена ряда, то все просто, а вот как найти первый член, больший 1000, не зная его номера...я в замешательстве...


 
Sonia ©   (2007-11-25 21:32) [8]


> Кстати, действительно решается банальным циклом, а не рекурсией

Я знаю, что решается. Но с промежуточными переменными (?).  А как по вашему будет красивее?
ЗЫ факториал, тоже можно циклом сделать, а можно рекурсией :) И как книжки пишут, рекурсией красивее


 
Правильный_Вася   (2007-11-25 21:37) [9]


> как книжки пишут, рекурсией красивее

это пример, а не образец


 
Sonia ©   (2007-11-25 21:43) [10]


> это пример, а не образец

Я понимаю, что пример, и не говорю ему следовать :)
Однако вопрос стоит четко.


 
DrPass ©   (2007-11-25 21:58) [11]


> И как книжки пишут, рекурсией красивее

Может быть, и красивее, не спорю. Красота - субъективное понятие.
Но что при использовании цикла
а) алгоритм будет работать в несколько раз быстрее
б) алгоритм будет использовать всего несколько десятков байт памяти независимо от N, в то время как рекурсия будет жрать совершенно дикие N * <несколько десятков байт памяти>
- это неопровержимый факт.


 
Sonia ©   (2007-11-25 22:04) [12]


> DrPass ©   (25.11.07 21:58) [11]

Спасибо! Я все учту и запомню. Однако теперь уже чисто ради интереса надо понять, как сделать это рекурсией :) Так что вопрос остается в силе


 
@!!ex ©   (2007-11-25 22:07) [13]

> А по сему:
> 1) как вы думаете, задавала бы я вопросы, если бы хорошо
> знала рекурсию?

Сорри. Не хотел обидеть. Просто было ощущение, что  ты более менее разбираешься в порграммирование. А тут вдруг выясняется, что ты не знаешь рекурсию. :(


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

А я и не говорил что плохо спрошено. Это вообще было DrPass"у, который считает, что мой вариант  неправильный.
На что я и ответил, да не правильный, но на вопрос отвечает.


> Если использовать номер члена ряда, то все просто, а вот
> как найти первый член, больший 1000, не зная его номера...я
> в замешательстве...

Вот теперб вопроса реально не понял...


> Я знаю, что решается. Но с промежуточными переменными (?
> ).  А как по вашему будет красивее?

В отличии от математики, где красивое решение - обычно самое рациональное, в программировании все наоборот в 99,(9)% случаев.
Надо решать через цикл. А еще желательно хранить массив с уже расчитанными элементами.
Тогда первый расчет для 1000 будет долгим, зато второй - мгновенным.

P.S.
Кстати, рекурсия загнется на больших числах.


 
Sonia ©   (2007-11-26 00:04) [14]


> Сорри. Не хотел обидеть. Просто было ощущение, что  ты более
> менее разбираешься в порграммирование.

Ты видимо решил меня доконать...обидеть еще дальше... Пойми ты, если человек не очень хорошо знает рекурсию, не значит, что он не разбирается в программировании!!!


> Вот теперб вопроса реально не понял...

Чего ты не понял? условие поиска члена ряда не по номеру члена, а по самому члену (большему 1000 в данном случае).


> Надо решать через цикл

Уже учла пожелания, но все равно интересно, возможно ли такое...


 
DrPass ©   (2007-11-26 00:28) [15]


> Уже учла пожелания, но все равно интересно, возможно ли
> такое...

Ну, возможно конечно. Что мешает крутить рекурсию в другую сторону, по пути цикла? Я бы решил как-нибудь так:
function Fibonachi(prev1, prev2, limit:integer):integer;
var
 n: integer
begin
 n:= prev1 + prev2;
 if n > limit then Result:= n else Result:= Fibonachi(prev2, n, limit);
end;


Стартовать так: Fibonachi(1, 1, 1000)
Решение надуманное, конечно. Но решение ведь


 
@!!ex ©   (2007-11-26 05:43) [16]

> Ты видимо решил меня доконать...обидеть еще дальше... Пойми
> ты, если человек не очень хорошо знает рекурсию, не значит,
> что он не разбирается в программировании!!!

фига се...
Сорри. правда не хотел!


> Чего ты не понял? условие поиска члена ряда не по номеру
> члена, а по самому члену (большему 1000 в данном случае)
> .

Тоесть надо найти номер члена, у которого значение равно заданному? ;)


> Уже учла пожелания, но все равно интересно, возможно ли
> такое...

Возможно.


 
Sonia ©   (2007-11-26 14:03) [17]


> DrPass ©   (26.11.07 00:28) [15]

Спасибо!!! Я примерно так и представляла, только думала обойтись без промежуточных 2-х предыдущих членов :)
Вопрос можно считать закрытым.



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2007.12.23;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.031 c
15-1195800245
KSergey
2007-11-23 09:44
2007.12.23
Пресловутый переход на висту


9-1164018658
Ярослав Ерёменко
2006-11-20 13:30
2007.12.23
Алгоритм отрисовки тайлов методом альфа-блендинга


2-1196113083
DeeCee
2007-11-27 00:38
2007.12.23
Задачка на массивы


2-1196417567
Pacific
2007-11-30 13:12
2007.12.23
Как


2-1196060084
O.O
2007-11-26 09:54
2007.12.23
Отключение от FireBird





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский