PL/SQL生成杨辉三角报错求助,求代码问题排查
帮你搞定PL/SQL版杨辉三角的问题
嘿,作为PL/SQL新手,写杨辉三角确实容易踩一堆小坑,我先帮你捋清楚现有代码的问题,再给你一个能正常跑的版本~
先说说你代码里的几个明显问题
- 代码不完整:最后那个
ELSE L:=L-1;后面的内容截断了,这直接会导致语法错误,PL/SQL编译器根本没法解析完整的逻辑 - 核心逻辑跑偏:杨辉三角的每个数是上一行相邻两个数的和,或者用组合数公式计算,但你代码里直接输出
K+1,这会输出类似1;1 2;1 2 3...的序列,完全不是杨辉三角的结构 - 空格控制逻辑错误:你初始化
T:=N-2后,循环里没更新过T的值,导致每行前面的空格都一样,杨辉三角应该是每行前面的空格逐行减少才能形成三角形状 - 变量冗余混乱:
S、L这些变量的作用不清晰,反而把逻辑搞复杂了,其实根本不需要这么多变量
修正后的完整可运行代码
SET SERVEROUTPUT ON; DECLARE n NUMBER; i NUMBER; j NUMBER; k NUMBER; comb NUMBER; -- 存储当前位置的组合数 BEGIN DBMS_OUTPUT.PUT_LINE('ENTER THE LIMIT'); n := &n; -- 接收用户输入的行数 -- 遍历每一行,从第0行到第n-1行(共n行) FOR i IN 0..n-1 LOOP -- 打印每行前面的空格,实现居中效果 FOR j IN 1..n-1-i LOOP DBMS_OUTPUT.PUT(' '); END LOOP; -- 计算并打印当前行的每个数字 FOR k IN 0..i LOOP -- 组合数C(i,k)的递推计算:避免直接算阶乘溢出 IF k = 0 OR k = i THEN comb := 1; ELSE comb := comb * (i - k + 1) / k; END IF; DBMS_OUTPUT.PUT(comb || ' '); -- 数字加空格分隔,让格式更整齐 END LOOP; DBMS_OUTPUT.NEW_LINE; -- 换行到下一行 END LOOP; END; /
代码逻辑说明
- 循环选择:用
FOR循环代替WHILE,PL/SQL里处理固定次数的循环,FOR更简洁易读,不用手动维护循环变量的增减 - 空格控制:每行前面的空格数是
n-1-i,随着行数i增加,空格数逐行减少,自然形成居中的三角 - 组合数递推:杨辉三角的第i行第k个数就是组合数
C(i,k),用递推公式C(i,k) = C(i,k-1)*(i-k+1)/k计算,既简单又避免了大阶乘导致的数值溢出 - 边界处理:每行的第一个和最后一个数都是1,直接赋值即可
新手小提示
- 输入的
n最好是正整数,比如输入5,就会输出5行标准的杨辉三角 - 如果需要更紧凑的格式,可以调整
DBMS_OUTPUT.PUT里的空格数量,比如把' '改成' ' - 记得打开
SERVEROUTPUT,不然看不到输出结果哦
内容的提问来源于stack exchange,提问作者Soutrik Mukherjee
相关产品推荐
相关产品推荐

