2016-11-25 64 views
0

美好的一天,序言序列

我有一個任務(不是作業),但測試準備問題。給定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中「思考」。

TIA,

COSON

+0

同樣,我阻礙。對我來說,你似乎只是將3提升爲非負的能力,而'X是3 ** N'就是你所需要的。你爲什麼把列表和遞歸帶入這個?我的困惑更加強烈,因爲你問了一個[類似奇怪的問題](http://stackoverflow.com/questions/40700921/prolog-tree-traversal),並且從未對收到的反饋作出反應。 – 2016-11-25 07:41:49

+0

@Boris,這正是我的觀點。我對Prolog很陌生,所以也許我沒有正確表達自己。但那是我的問題的一部分。列表和遞歸是解決這個問題所必需的。就我剛纔提到的另一個問題而言,我意識到它沒有正確表達。我很抱歉沒有回來。 – coson

回答

0

如果你想要做一個列表中的所有元素的東西則是大部分的時間你需要遞歸(除了情況下,當您使用謂詞喜歡fundall/3這確實等等遞歸......)。

如果你想在一個參數中返回你的結果,而不是僅僅打印它,那麼你需要上面的謂詞兩個列表(一個是輸入,另一個是輸出)。

雖然我不明白爲什麼不只是寫:

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

從我瞭解你算算3 ^我爲每一個我< = n和保持其可以獨立完成的最後一個元素。所以,如果我正確地理解你想做什麼,這可以在不使用列表和遞歸的情況下完成(如果你使用預定義的pow函數,否則如果你編寫一個計算3^n的權力的謂詞,那麼你會使用遞歸.. )。

實施例:

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

好吧,我一天的工作方式太晚了。作爲Prolog的一個小菜鳥,我很痛苦地表明,我很快就意識到了這一點。但很高興知道並非所有Prolog解決方案都需要遞歸。 – coson

+0

很高興幫助! – coder