recursion - 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).
当然不行。
解决方案
尝试这个:
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 ),计算并打印输出。如果,和没有不同,它将什么也不做。主要谓词需要知道何时停止(不是)。否则它将调用写谓词并使用递增的( ) 调用自身。J
K
!
I
J
K
rec_k/3
K < 9
K
KK
它可以在没有辅助谓词的情况下编写(返回相同的输出):
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)
).
推荐阅读
- python - 求解列表python中的算术方程
- c - 如何捕获对设备文件的写入和读取
- c - C - 忽略 scanf() 中的空格
- javascript - 获取数据后,异步响应渲染组件
- java - 如何检查 Firestore 上的空文档?
- python - 进行 Alembic 升级的试运行
- swift - 用十六进制,八进制和二进制写整数有什么意义?
- microservices - Spring Cloud Netflix & Spring Cloud Data Flow 微服务架构
- c++ - ZeroMq:打开的文件太多.. fd 使用量在同一对象上持续增长
- python-2.7 - Matplotlib 在使用 plt.savefig() 时失去绘图功能