Việc sửa đổi các câu trả lời trước đó để thực sự cung cấp cho bạn hình tam giác Pascal, mà bạn đã đề cập là bạn đang cố gắng trong một nhận xét:
set serveroutput on format wrapped
declare
n number(2):=5;
begin
for a in 1..n loop
for b in 1..n-a loop
dbms_output.put(' ');
end loop;
for c in 1..2*a-1 loop
dbms_output.put('*');
end loop;
dbms_output.new_line;
end loop;
end;
/
*
***
*****
*******
*********
PL/SQL procedure successfully completed.
Cả dbms_output.put_line
của bạn cuộc gọi cần thiết chỉ là dbms_output.put
, vì điều đó đang in từng *
trên một dòng của riêng nó. Nhưng bạn cần ngắt dòng sau mỗi lần khoảng a
vòng lặp, vì vậy tôi đã thêm một dbms_output.newline
khi kết thúc điều đó. Bạn cũng đang giảm temp
bên trong b
vòng lặp, có nghĩa là nó bằng 0 thay vì (n-1)
lần thứ hai xung quanh a
vòng; nhưng bạn không thực sự cần một temp
riêng biệt ở tất cả các biến vì điều đó luôn giống với (n-a)+1
và +1
chỉ đặt thêm một khoảng trống trên mỗi dòng. (Tôi cũng đã đặt a
vòng lặp 1..n
vì tôi giả sử bạn muốn thay đổi giá trị của n
sau này chỉ ở một nơi). Với n := 8
:
*
***
*****
*******
*********
***********
*************
***************
Tuy nhiên, điều quan trọng là bạn cũng phải set serveroutput on format wrapped
, nếu không thì các khoảng trắng đầu bạn đang tạo trong b
vòng lặp bị loại bỏ.
Bạn cũng có thể thực hiện việc này trong SQL thuần túy, mặc dù bạn cần cung cấp 5
hai lần hoặc sử dụng biến liên kết hoặc thay thế:
select lpad(' ', 5 - level, ' ') || rpad('*', (level * 2) - 1, '*') as pascal
from dual
connect by level <= 5
PASCAL
------------------------------
*
***
*****
*******
*********
b
của bạn và c
các vòng lặp chỉ thực hiện một lpad
thủ công thực sự.