2016-11-25 37 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