如何计算不成对数字的总和达到N?

时间:2011-10-13 19:55:06

标签: prolog

我在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

3 个答案:

答案 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; }