2011-10-13 45 views
1

我在prolog上有一些代码,但是这段代码不起作用。在PHP如何计算最多N个不成对数字的总和?

function sum($n) 
    { 
    if($n < 0) return; 
    if($n%2 == 0) return sum($n-1); 
    else return ($n+sum($n-2)); 
    } 

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). 

正确的递归函数,我需要这个功能转化为序言。 (例如, sum(N,Result))。

? - sum(6,Result),write(Result)。

预计9

+0

我用程序语言编写递归函数。如何在prolog中转换? – BILL

+0

函数总和($ n){ if($ n <0)return; if($ n%2 == 0)return sum($ n-1);其他 return($ n + sum($ n-2)); } – BILL

+0

我认为如果N <1,php返回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. 
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) 
    . 
+0

错误的结果。请看我的递归函数。 – BILL

+0

你如何用英语写一篇可读的问题陈述,带有样本输入及其预期输出? –

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