2016-11-25 3 views
0

Добрый день,Последовательности Prolog

У меня есть задача (не домашняя работа), но вопрос подготовки теста. Учитывая значение n, где n> 0. Мне нужно выяснить, какое значение 3 ** n. У меня есть что-то, что работает.

% expo 
expo([],[]). 
expo([X|T], [Y|Result]):- 
    number(X), 
    Y is 3^X, 
    expo(T,Result). 
expo([ThrowAway|Tail], [ThrowAway|Result]):- 
    expo(Tail,Result). 

last([X]):- 
    write("M = "), 
    write(X). 

last([Y|Tail]):- 
    last(Tail). 

do_list(N) :- 
    findall(Num, between(0, N, Num), L), 
    expo(L, E), 
    last(E). 

Когда я запускаю это в консоли:

do_list(4). 
M = 81 
true. 

Так это дает мне то, что я хочу. Но нужно ли рекурсивное решение? Я просто хочу сгенерировать последовательность чисел и использовать эти числа в качестве моего экспонента, который я сделал, но мне пришлось создать два списка.

В идеале я хотел бы сделать:

do_list(4, M). 
M = 81 
true. 

Возможно ли это сделать без двух списков? Возможно ли это без рекурсии? Я новичок в Prolog, поэтому я немного привык к «размышлению» в Prolog.

ТИА,

Coson

+0

Опять же, я загнаны в угол. Мне кажется, что вы просто поднимаете 3 до неотрицательной силы, а 'X - это 3 ** N' - это все, что вам нужно. Почему вы ввели списки и рекурсию? Моя путаница еще сильнее, потому что вы задали [аналогичный странный вопрос до] (http://stackoverflow.com/questions/40700921/prolog-tree-traversal) и никогда не реагировали на полученные вами отзывы. –

+0

@Boris, это точно моя точка. Я новичок в Prolog, поэтому, возможно, я не очень правильно себя чувствую. Но это было частью моего вопроса. Для решения этой проблемы необходимы списки и рекурсия. Что касается вашего предыдущего вопроса о другом вопросе, который я задал, я понял, что он не был правильно сформулирован. Я прошу прощения за то, что не вернулся. – coson

ответ

0

Если вы хотите сделать что-то во всех элементах списка, то да в большинстве случаев вам нужно рекурсии (за исключением случаев, когда вы используете предикаты как fundall/3, который выполняет рекурсия ...).

Если вы хотите вернуть свой результат в аргумент, а не просто распечатать его, вам понадобится для вышеуказанного предиката два списка (один - это вход, а другой - выход).

Хотя я не понимаю, почему не просто писать:

find_pow(Input,Output):-Output is 3^Input. 

Из того, что я понял, вы вычислить 3^I для любого я < = п и сохранить последний элемент, который может быть сделано независимо друг от друга. Поэтому, если я правильно понял, что вы пытаетесь сделать, это можно сделать без использования списков и рекурсии (если вы используете предопределенную функцию pow^else, если вы пишете предикат, который вычисляет мощность 3^n, тогда вы будете использовать рекурсию. .).

Пример:

?- find_pow(4,X). 
X = 81. 
+0

ОК, я работал слишком поздно в этот день. Будучи нубом для Пролога, было мучительно очевидно, что я был wayyyyyy overthinking это. Но хорошо знать, что не все решения проблем в Prolog требуют рекурсии. – coson

+0

рад, что помог !!! – coder

Смежные вопросы