美好的一天,
我有一项任务(不是家庭作业),但是考试准备问题。给定n的值,其中n>我需要找出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 :(得分:0)
如果你想在列表的所有元素中执行某些操作,那么大多数时候你需要递归(除了像你使用像fundall/3
这样的谓词进行递归的情况......)。
如果你想在参数中返回你的结果而不是只打印它,那么你需要上面的谓词两个列表(一个是输入,另一个是输出)。
虽然我不明白为什么不写作:
find_pow(Input,Output):-Output is 3^Input.
根据我的理解,你为每个i< = n计算3 ^ i并保留可以独立完成的最后一个元素。因此,如果我理解你正在尝试做什么,这可以在不使用列表和递归的情况下完成(如果你使用预定义的pow函数^ else,如果你编写一个计算幂3 ^ n的谓词,那么你将使用递归.. 。)。
示例:
?- find_pow(4,X).
X = 81.