【问题标题】:Prolog - making a recursive divisorProlog - 制作递归除数
【发布时间】:2013-02-21 17:27:35
【问题描述】:

好的,所以我是 Prolog 的初学者,所以如果我不能非常清楚地表达我的问题,我很抱歉,但这是我正在努力的地方:

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.

我正在尝试编写一个程序,该程序将接受两个参数(X 和 D)并返回 Iterations (I) 和 Remainder (R),以便在用户输入时显示 X / D 的结果: 除数(8,3,I,R)。例如。

在跟踪代码时,我知道我是不正确的,因为第一个增量使其等于 0,因此计数是错误的。但是我不知道如何声明 I 是 0 而不会在每次通过循环递归时重置。 (我不想在查询中将 I 声明为 0)

我还意识到,当它完成递归时(当 X

谁能告诉我如何解决这个问题?

【问题讨论】:

    标签: recursion prolog increment


    【解决方案1】:

    您需要引入 累加器 并使用辅助谓词,如下所示:

    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!
    

    【讨论】:

    • 这很有道理,谢谢!如此简单,但我就是无法到达那里。不过,在第二种情况下,您会希望 >= 而在第一种情况下只需要
    • @user2096383:已为您修复。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-19
    • 1970-01-01
    • 2017-04-26
    • 2011-12-09
    • 2014-06-16
    • 2018-10-09
    相关资源
    最近更新 更多