使用空格在prolog中编写递归星号函数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用空格在prolog中编写递归星号函数相关的知识,希望对你有一定的参考价值。

我要在prolog中编写一个谓词,它接受一个整数X并输出一个镜像的星号模式:

******
**  **
*    *
*    *
**  **
******
答案

该程序打印所需的模式(我用下划线替换空格):

printStar(0).
printStar(N):-
    write('*'),
    N1 is N-1,
    printStar(N1).

printSpaces(0).
printSpaces(N):-
    write('_'),
    N1 is N-1,
    printSpaces(N1).

printUpperPattern(0,_).
printUpperPattern(N,R):-
    N > 0,
    Spaces is 2*R - 2,
    printStar(N),
    printSpaces(Spaces),
    printStar(N),
    nl,
    N1 is N-1,
    R1 is R+1,
    printUpperPattern(N1,R1).

printLowerPattern(0,_).
printLowerPattern(N,R):-
    N > 0,
    Spaces is 2*N - 2,
    printStar(R),
    printSpaces(Spaces),
    printStar(R),
    nl,
    N1 is N-1,
    R1 is R+1,
    printLowerPattern(N1,R1).

pattern(N):-
    printUpperPattern(N,1),
    printLowerPattern(N,1).
另一答案

你可以做 :

rectangle(Len) :-
    Max is Len/2 - 1,
    forall(between(0,Max,I), write_line(Max, I)),
    forall(between(0,Max,I), (J is Max-I, write_line(Max, J))).

write_line(Max, N) :-
    Stars is Max+1 - N,
    Spaces is 2 * N,
    forall(between(1,Stars, _), write('*')),
    forall(between(1,Spaces, _), write(' ')),
    forall(between(1,Stars, _), write('*')),
    nl.

例如 :

?- rectangle(6).
******
**  **
*    *
*    *
**  **
******
true.

?- rectangle(8).
********
***  ***
**    **
*      *
*      *
**    **
***  ***
********
true.

?- rectangle(10).
**********
****  ****
***    ***
**      **
*        *
*        *
**      **
***    ***
****  ****
**********
true.

以上是关于使用空格在prolog中编写递归星号函数的主要内容,如果未能解决你的问题,请参考以下文章

c语言中的星号“*” 都有啥作用,含代码提问 求帮忙读一行程序

Prolog递归方法

根据Prolog中公共子树的数量,树之间的递归相似度

参数中的星号和与号

Prolog递归永远循环

Prolog使用在内部谓词之间的列表