Из локального стека пытается проверить функцию Фибоначчи в Прологе - PullRequest
2 голосов
/ 30 марта 2012

Я сделал две разные функции Фибоначчи, первая работала отлично. Затем я попытался упростить это интуитивно понятным способом. Я думал, что это будет работать, но по какой-то причине он говорит ОШИБКА: вне локального стека каждый раз, когда я проверяю его.

Рабочая версия:

fibonacci(0,0).
fibonacci(1,1).
fibonacci(N,F) :- N1 is N-1, N2 is N-2, fibonacci(N1,F1), fibonacci(N2,F2), F is F1+F2.

Не рабочая версия:

fibonacci(0,0).
fibonacci(1,1).
fibonacci(N,F) :- fibonacci(N-1,F1), fibonacci(N-2,F2), F is F1+F2.

Может кто-нибудь объяснить мне, в чем проблема со вторым? Спасибо.

Ответы [ 2 ]

3 голосов
/ 30 марта 2012

Ваша проблема в том, что во втором вы рекурсивно вызываете fibonacci / 2 с термином N-1 вместо целого числа со значением N-1.

Так, например, если вы звоните fibonacci(3, F) будет введено в третьем предложении и вызовет fibonacci(3-1, F1) вместо fibonacci(2, F1).Затем он снова введет в третьем предложении и вызовет fibonacci(3-1-1, F1) и т. Д.

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

1 голос
/ 31 марта 2012

Разве это не будет проще?Определите fibonnaci\3 так, чтобы первые два аргумента были двумя начальными элементами (обычно 1 и 1, хотя они могут быть любыми двумя положительными целыми числами).Третий аргумент - это вычисленное значение этого элемента серии.

Все, что вам нужно сделать, это поддерживать скользящее окно, когда вы повторяете последовательность Фибоначчи, таким образом:

...