Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вычмсление чисел Фибоначчи 
:(
    Опции темы
Smasher
Дата 22.3.2009, 18:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 22.3.2009
Где: Odessa, Ukraine

Репутация: нет
Всего: нет



Вот так вот я вычисляю числа Фибоначчи, но мне надо их вычислять при помощи рекурсии в конце, чтобы это сделать надо раскоментить 2 строчку в clauses, но если это сделать то прога перестаёт работать и как бы пропускает вычисление, подскажите пожалуйста как это это сделать или предложите другой вариант вычислений чисел Фибоначчи, но только с рекурсией в конце

class predicates
fib:(integer,integer) nondeterm anyflow.
fib:() nondeterm anyflow.

clauses
fib():-fib(1,1).
%fib(M,N):-!.
fib(M,N):-M1=N,N1=N+M,stdIO::write(M," "),fib(M1,N1).


Заранее благодарен
PM MAIL WWW ICQ   Вверх
t_gran
Дата 24.3.2009, 08:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 621
Регистрация: 13.11.2007
Где: г.Усть-Илимск

Репутация: нет
Всего: 37



Цитата

прога перестаёт работать и как бы пропускает вычисление


Правильно, ведь prolog твои значения подставляет в fib(M,N):-!. и сразу выходит.

Братко предлагает следующее:
Код

фиб(1, 1).    % 1-е число Фибоначчи

фиб(2, 1).    % 2-е число Фибоначчи

фиб(N, F) :-  % N-е число Фиб., N > 2
   N > 2,
   N1 is N-1, фиб(N1, F1),
   N2 is N-2, фиб(N2, F2),
   F is F1+F2.                        % N-e число есть сумма двух предыдущих


А вот, к примеру, моя модификация
Код

fib(0,1,1).

fib(D,M,N):-
   D > 0,
   D1 is D-1,
   fib(D1,M1,N1),
   N is M1,
   M is M1 + N1.

где, D-порядковый номер, а M и N-соседние числа. Тест:
Код

?- fib(10,N,M).
N = 144,
M = 89 .




Это сообщение отредактировал(а) t_gran - 24.3.2009, 08:40


--------------------
Я знаю, что ничего не знаю© Сократ
user posted image
PM MAIL WWW   Вверх
Smasher
Дата 24.3.2009, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 22.3.2009
Где: Odessa, Ukraine

Репутация: нет
Всего: нет



t_gran, 
да но мне надо с хвостовой рекурсией
PM MAIL WWW ICQ   Вверх
t_gran
Дата 27.3.2009, 03:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 621
Регистрация: 13.11.2007
Где: г.Усть-Илимск

Репутация: нет
Всего: 37



Пардон! smile
Код

myfib(D,P,D,P,_) :- !.

myfib(D,P,I,N,M) :-
   I1 is I+1,
   N1 is N+M,
   M1 is N,
   myfib(D,P,I1,N1,M1).

fib(D,P) :-
   myfib(D,P,1,1,1).


Вот хвостовая. smile Тест думаю не надо писать.


Это сообщение отредактировал(а) t_gran - 27.3.2009, 05:47


--------------------
Я знаю, что ничего не знаю© Сократ
user posted image
PM MAIL WWW   Вверх
Винитарх
Дата 16.2.2010, 12:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 21.1.2007

Репутация: нет
Всего: нет



Дааа. Как всё здесь запущено!
Вот прога Фибоначчи на Visual Prolog 7.2 согласно математическому определению:
Код
fib(0)=1:-!.
fib(1)=1:-!.
fib(N) = fib(N-1)+fib(N-2).

А вот эффективная прога на том же Visual Prolog 7.2 (третий аргумент - индекс искомого члена, способ вызова 46-го члена: N=fib(1,1,46) ):
Код
fib(X,Y,3)=X+Y:-!.
fib(X,Y,N) = fib(Y,X+Y,N-1).

Приходите к нам на progz.ru. Мы Вам покажем современный П Р О Л О Г!!!

Это сообщение отредактировал(а) Винитарх - 20.2.2010, 20:03
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума Prolog
Void
  • Пожалуйста, создавайте темы с содержательными названиями.
  • Уважаемые учащиеся, здесь всегда рады помочь Вам, но не делать за Вас вашу работу. У вас гораздо больше шансов получить помощь, если Вы приложите усилия и поделитесь с нами проблемами и результатами. В противном случае добро пожаловать в раздел Центр Помощи.
  • Получив ответ на интересующий Вас вопрос, не забудьте пометить его как решённый.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Void.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Prolog | Следующая тема »


 




[ Время генерации скрипта: 0.0425 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.