Как вычислить сумму непарных чисел до N? - PullRequest
1 голос
/ 13 октября 2011

У меня есть код на прологе, но этот код не работает.

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

Мне нужно преобразовать эту функцию в пролог.

Например, сумма (N, результат).

? - сумма (6, Результат), запись (Результат).

ожидается 9

Ответы [ 3 ]

1 голос
/ 14 октября 2011

Здесь приведен довольно прямой перевод кода PHP, который случайно указывает на слабую точку (IMO) кода Prolog применительно к численным задачам: необходимость явного представления выражений промежуточных результатов. Условно мы используем последний аргумент для представления «возвращаемого значения».

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 голосов
/ 14 октября 2011

Этот работает

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; }
0 голосов
/ 14 октября 2011

Вы можете попробовать что-то вроде этого ...

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)
  .
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...