首页 > 解决方案 > prolog递归中的if语句

问题描述

我需要在序言中编写这段代码:

void rec_k(int k,int i,int j) { 
    if (!(k<9)) return;
    if ((i <> j) and (i <> k) and (j <> k)) {
        writeln(100 * i + 10 * j + k);
    }
    rec_k(k+1,i,j); 
}

我试过这个:

rec_k(K, I, J):-
    ((K >= 9) -> !;
        ((I <> J and I <> K and J <> K) -> write(100 * I + 10 * J + K);)
    ),
    rec_k(K+1,I,J).

当然不行。

标签: recursionprologvisual-prolog

解决方案


尝试这个:

writeKIJ(K,I,J):-
    (   I \= J, 
        I \= K, 
        J \= K
    ->  E is 100 * I + 10 * J + K,
        write(E),
        write('\n')
    ;   true
    ).

rec_k(K, I, J):-
    (   K < 9
    ->  writeKIJ(K,I,J),
        KK is K+1,
        rec_k(KK,I,J)
    ;   true
    ).

的输出rec_k(0,2,3).

?- rec_k(0,2,3).
230
231
234
235
236
237
238
true.

请注意:算术项可以使用 来计算is。我的解决方案引入了一个辅助谓词来执行输出:一旦它检查了 that并且不同I,它将防止回溯(使用所谓的 cut ),计算并打印输出。如果,和没有不同,它将什么也不做。主要谓词需要知道何时停止(不是)。否则它将调用写谓词并使用递增的( ) 调用自身。JK!IJKrec_k/3K < 9KKK

它可以在没有辅助谓词的情况下编写(返回相同的输出):

rec_k(K, I, J):-
    (   K >= 9
    ->  true
    ;   (   I \= J, 
            I \= K, 
            J \= K
        ->  E is 100 * I + 10 * J + K,
            write(E),
            write('\n')
        ;   true
        ),
        KK is K+1,
        rec_k(KK,I,J)
    ).

推荐阅读