/ / Astérisques Triangle dans le prologue - prologue

Astérisques Triangle dans le prologue - prologue

Je dois définir la pyramide prologue (N) qui imprime une pyramide d’astérisques de hauteur donnée, comme dans l’exemple suivant.

pyramid(4).
*
***
*****
*******

true

c'est ce que j'ai fait jusqu'à présent ... Je ne peux pas trouver le moyen d’imprimer le reste des étoiles nécessaires pour chaque ligne. J'ai également essayé de définir des prédicats de prise en charge pour gérer les sous-parties du programme.

pyramid(0) :-
nl.
pyramid(N) :-
N > 0,
N1 is N - 1,
foreach(between(1,N1,_), write(" ")),
write("*"), nl,
pyramid(N1).

Réponses:

0 pour la réponse № 1

Pensez au nombre d'étoiles que chaque niveau reçoit en termes de N. Dites que vous êtes à la ligne i, avec N = 4.

  • La première ligne obtient 3 (en fait, N-1) des espaces, une étoile et 3 autres espaces.
  • La deuxième ligne obtient 3 à 1 espaces, 3 étoiles et 3 à 1 espaces.
  • ila ligne devient (N - 1) - (i - 1) les espaces, 1 + 2 * (i - 1) étoiles et un autre (N - 1) - (i - 1) les espaces.

Donc ça donne:

pyramid(N) :- pyramid(N, N-1).

pyramid(0, _) :- nl.
pyramid(N, K) :- N > 0, N1 is N - 1,
foreach(between(1, N1, _), write(" ")),
Q is 2 * (K - N1) + 1,
foreach(between(1, Q, _), write("*")),
foreach(between(1, N1, _), write(" ")),
nl, pyramid(N1, K).

Je pense (mais pas sûr) que vous pouvez aussi enlever le N > 0 peu depuis l'affaire pyramid(0, _) sera vérifié en premier.


0 pour la réponse № 2

Quelque chose comme devrait vous faire:

pyramid(N) :-         % to make an ASCII art pyramid...
N > 0 ,             % - if first has to have a height,
pyramid( N-1 , 1 ). % - then just invoke the helper predicate.
.                   %

pyramid(I,_) :-         % If the indentation level has dropped below zero, we"re done.
I < 0 .               %
pyramid(I,C) :-         % otherwise...
I >= 0 ,              % - if the indentation level is non-negative...
repeat_write(I," ") , % - write that many spaces,
repeat_write(C,"*") , % - write the desired number of asterix characters
nl ,                  % - a new line,
I1 is I-1 ,           % - decrement the indentation level
C1 is C+2 ,           % - increment the asterix count
pyramid(I1,C1).       % - and recurse down.

repeat_write(0,_) .   % writing zero characters is easy.
repeat_write(N,C) :-  % writing N characters is also easy:
N > 0 ,             % - N must be positive
write(C),           % - write a single character
N1 is N-1 ,         % - decrement N
repeat_write(N1,C). % - recurse down.