Prolog draw/2谓词绘制星号时少输出一行的问题求解
问题原因分析
核心问题出在你定义的draw/2的终止子句逻辑缺失:
- 你编写的第一个子句
draw(N, N).作为递归终止条件,当当前要输出的星号数量等于上限M时,这个子句会直接匹配成功,没有执行line/2谓词输出对应数量的星号行,所以最后一行(星号数等于M的行)就被直接漏掉了。
我们可以走一遍draw(3,5)的调用流程验证问题:
- 调用
draw(3,5),匹配第二个子句:执行line(3, '*')输出3个星号的行,计算M1=4,判断4≤5成立,递归调用draw(4,5) - 调用
draw(4,5),匹配第二个子句:执行line(4, '*')输出4个星号的行,计算M1=5,判断5≤5成立,递归调用draw(5,5) - 调用
draw(5,5),直接匹配第一个子句draw(N,N),无任何输出操作直接结束,因此5个星号的行没有被打印。
修复方案
只需要给终止子句添加输出逻辑即可,修改后的draw/2代码如下:
draw(N, N) :- line(N, '*'). draw(M, N) :- line(M, '*'), M1 is M + 1, M1 =< N, draw(M1, N).
内容的提问来源于stack exchange,提问作者Julius
相关产品推荐
相关产品推荐

