我在prolog上有一些代码,但是这段代码不起作用。
sum(N,_):-N<0,fail.
sum(N,S):-N=0,S=0,!.
sum(N,S):-N1=N-1,sum(N1,S1),S=S1+N.
?-sum(4,X),write(X).
在PHP上纠正递归函数
function sum($n)
{
if($n < 0) return;
if($n%2 == 0) return sum($n-1);
else return ($n+sum($n-2));
}
我需要将此功能转换为prolog。
例如, 总和(N,结果)。
? - sum(6,Result),write(Result)。
预计9
答案 0 :(得分:1)
这里是PHP代码的一个相当直接的翻译,它恰好突出了Prolog代码在应用于数值问题时的(IMO)弱点:需要明确表示表达式中间结果。通常,我们使用最后一个参数来表示“返回值”。
sum(N, S) :-
( N < 0
-> S = 0
; ( Q is N mod 2,
Q == 0
-> M is N - 1,
sum(M, S)
; M is N - 2,
sum(M, T),
S is N + T
)
).
测试:
?- sum(6,X).
X = 9.
答案 1 :(得分:0)
您可以尝试这样的事情......
sum(N,X) :-
sum(N,0,X)
.
sum( 0 , X , X ).
sum( N , T , X ) :-
N > 0 ,
T1 is T+N ,
N1 is N-1 ,
sum( N1 , T1 , X )
.
sum( N , T , X ) :-
N < 0 ,
T1 is T+N ,
N1 is N+1 ,
sum( N1 , T1 , X )
.
你想要做的就是将0和N之间的奇数相加?我认为这应该可以解决问题:
sum(0,0).
sum(N,X) :-
N > 0 ,
( N mod 2 is 0 , N1 is N-1 ; N1 is N ) ,
sum(N1,0,X)
.
sum(N,X,X) :- N < 0 .
sum(N,T,X) :-
N1 is N - 2
T1 is T+N ,
sum(N1,T1,X)
.
答案 2 :(得分:0)
这个有效
sum(0,0).
sum(-1,0).
sum(N,R) :- N > 0, 0 is N mod 2,!, N1 is N - 1, sum(N1,R).
sum(N,R) :- N > 0, N2 is N - 2, sum(N2,R1), R is N + R1.
但是我会这样写:
sum(N,R) :- sum(N,0,R).
sum(0,A,A) :- !.
sum(N,A,R) :- N1 is N-1, (1 is N mod 2 -> A1 is A + N; A1 = A), sum(N1,A1,R).
它等同于:
int a = 0;
for(int i=N;i>0;i--) { if (i % 2==1) a += i; }