2013-02-21 8 views
1

Ok, donc je suis un débutant en Prolog, donc je suis désolé si je ne peux pas tout à fait poser ma question à travers très clairement, mais c'est là que je me bats:Prolog - faire un diviseur récursive

divide_by(X, D, I, R) :- (D > X), I is 0, R is X. 

divide_by(X, D, I, R) :- 
X >= D, 
X_1 is X - D, 
I_1 is I + 1, 
divide_by(X_1, D, I_1, R), 
R is X_1. 

J'essaye d'écrire un programme qui acceptera deux arguments (X et D) et retournerai les itérations (I) et le reste (R) afin qu'il puisse afficher le résultat de X/D quand l'utilisateur entre: divide_by (8,3, I, R). par exemple.

Lors du suivi du code, je sais que I est incorrect car le premier incrément le rend égal à 0 et donc le compte est faux. Mais je ne sais pas comment déclarer I est 0 sans qu'il se réinitialise chaque fois qu'il récursse à travers la boucle. (Je ne veux pas déclarer I comme 0 dans la requête)

J'ai également réalisé que quand il a fini de récurer (quand X < D) alors I va être mis à 0 à cause du cas de base.

Est-ce que quelqu'un serait assez aimable pour me montrer comment je peux résoudre ce problème?

Répondre

1

Vous devez introduire un accumulateur et utiliser un prédicat d'aide, quelque chose comme ceci:

divide(_,0,_,_) :- !, fail . % X/0 is undefined and so can't be solved. 
divide(0,_,0,0) :- !.  % 0/X is always 0. 
divide(X,Y,Q,R) :-   % the ordinary case, simply invoke the 
    divrem(X,Y,0,Q,R)   % helper with the accumulator seeded with 0 
    . 

divrem(X,Y,Q,Q,X) :- % if X < Y, we're done. 
    X < Y .    % 
divrem(X,Y,T,Q,R) :- % otherwise... 
    X >= Y ,    % as long as X >= Y, 
    X1 is X - Y ,  % compute the next X 
    T1 is T + 1 ,  % increment the accumulator 
    divrem(X1,Y,T1,Q,R) % recurse down 
    .     % Easy! 
+0

Cela est tellement logique, merci! Tellement simple, mais je ne pouvais tout simplement pas y arriver. Cependant, vous voudriez> = dans le second cas et juste user2096383

+0

@ user2096383: Correction du problème pour vous . –