我是这种语言的新手,所以,我正在练习我在网上找到的一些练习,这个人说如果给出一个“阵列”你就要返回这个数字
即:
func([1,22,4],R).
R= 1224.
好的,所以......我想我有一个想法,但就像我说的那样,我很喜欢这个,所以,就是这样,
我取出阵列的“头部”并按“阵列”的长度驱动它,然后抓住尾巴重复这个过程...
这是我在网上找到的:
power(0,N,0) :- N>0.
power(X,0,1) :- X>0.
power(X,N,V) :- X>0, N>0, N1 is N-1, power(X,N1,V1), V is V1*X.
我的代码:
func(Number,Answer) :-
Pow is length(Number,P),
trab(Number,Number,R,Pow).
trab(Number,[X|XS],R,Pot) :-
R1 is (power(X,Pow),R2),
R is R+R1,
trab(Numero,XS,R,Pot-1).
我知道这一切都错了,但是,你们可以帮帮我吗?
感谢。
答案 0 :(得分:1)
该示例表明func/2
谓词只是连接第一个参数中传递的列表中的所有元素。如果是这样,请查看标准谓词number_codes/2
,atom_codes/2
和atom_concat/3
的文档。另请注意,func/2
谓词需要“遍历”列表,这可以使用递归定义轻松完成。最后,请注意,您需要一种方法来累积中间串联结果,直到到达输入列表的末尾。
答案 1 :(得分:1)
作弊(仅限SWI-Prolog):
func(A,B) :- atomic_list_concat(A,T),atom_number(T,B).
现在代码:
func(Number,Answer):-
Pow is length(Number,P), % P is a singleton
trab(Number,Number,R,Pow). % R is a singleton
修改后的语法可以是
func(Numbers,Answer):-
length(Numbers,Pow),
trab(Numbers,Pow,Answer).
但无论如何它都不会起作用:你的元素位置可能超过1位 (如22),然后就像战俘打算做的那样,对最左边的人进行预先计算是虚幻的。 相反,您必须沿着列表向下走到最后一个元素,其中指数为0
?- X is 10^0.
X = 1.
并计算指数以回传'对于左边的数字,占数字的大小。这很复杂......让我们假设我们输入的数字最多为2位数(0..99),那么基本情况可能是
trab([Digit], Pow, Answer) :-
Expo is 0,
Answer is Digit * 10^Expo,
increment_expo(Digit, Expo, Pow).
和increment_expo必须检查Digit是否落在0..9或10..99等
注意:与您的代码不同,Pow是输出,而不是输入。
更容易遵循保罗的建议。
答案 2 :(得分:1)
我建议使用一个累加器,它包含代表仍然需要处理的部分之前的列表的数字。
你必须将累加器乘以10到列表第一个元素的位数的幂,并将第一个元素添加到它。然后你可以递归地继续。如果列表为空,我们就完成了:
func(List,N) :-
func2(List,0,N).
func2([],Acc,Acc). % Base case: just return the accumulator
func2([H|T],Acc,N) :-
Digits is floor(log(10,H)) + 1, % Digits is the numbers of digits
% integer(...) is needed because ** returns a float:
NewAcc is Acc * integer(10**Digits) + H,
func2(T,NewAcc,N).
更新:我意识到log/2
是特定于SICStus的,因为SWI使用log10(H)
而不是log(10,H)
。