PL/SQL 创建过程 - 阶乘
PL/SQL CREATE PROCEDURE - factorial
我不知道我的代码块有什么问题来创建一个过程来找出数字的阶乘。谢谢。
问题 1:编写一个存储过程,获取一个整数 n 并计算并显示它的阶乘。
SET SERVEROUTPUT ON;
CREATE OR REPLACE PROCEDURE factorial_number(
n NUMBER) AS
factorial NUMBER;
num Number;
BEGIN
FOR i IN REVERSE 1..n LOOP
num := i - 1;
factorial := factorial * num;
END LOOP;
DBMS_OUTPUT.PUT_LINE (factorial);
EXCEPTION
WHEN OTHERS
THEN DBMS_OUTPUT.PUT_LINE ('Error!');
END;
/
BEGIN
factorial_number(5);
END;
/
怎么样
SQL> CREATE OR REPLACE PROCEDURE factorial_number (n NUMBER)
2 AS
3 factorial NUMBER := 1;
4 BEGIN
5 FOR i IN 1 .. n
6 LOOP
7 factorial := factorial * i;
8 END LOOP;
9
10 DBMS_OUTPUT.PUT_LINE (factorial);
11 END;
12 /
Procedure created.
SQL>
SQL> BEGIN
2 factorial_number (5);
3 END;
4 /
120
PL/SQL procedure successfully completed.
SQL>
- 您未能初始化局部变量
factorial
。未初始化的变量最初是 null
并且 null
乘以任何值产生 null
.
- 我不明白你为什么希望你的循环以相反的顺序进行。这无关紧要,因为乘法是共同的,但它不太可能使您的代码更易于阅读/调试/遵循。
- 您不想在循环的每次迭代中从乘以的值中减去 1。例如,当
i = 1
时,您将 factorial
乘以 0,这意味着(假设您初始化 factorial
),您总是以 0 结束。您想要乘以 i
所以不需要局部变量 num
.
如果我进行这些修复
CREATE OR REPLACE PROCEDURE factorial_number(
n NUMBER)
AS
factorial NUMBER := 1; -- Initialize
BEGIN
FOR i IN 1..n LOOP -- Loop normally
dbms_output.put_line( 'Beginning iteration ' || i || ' of loop. ' ||
'Factorial = ' || factorial ||
' multiplying by ' || i );
factorial := factorial * i; -- Multiply by i not i-1
END LOOP;
DBMS_OUTPUT.PUT_LINE (factorial);
EXCEPTION
WHEN OTHERS
THEN DBMS_OUTPUT.PUT_LINE ('Error!');
END;
然后
BEGIN
factorial_number(5);
END;
将打印出 120 (5*4*3*2*1
)。
我还添加了一个额外的 dbms_output
行来在循环的每次迭代中打印出变量的当前状态。这是一种相对老派的调试方法。在现代世界中,您将使用调试器遍历代码,您可以在其中查看局部变量的值,但介绍性的 类 最初可能不会教授调试器的用法。
我不知道我的代码块有什么问题来创建一个过程来找出数字的阶乘。谢谢。
问题 1:编写一个存储过程,获取一个整数 n 并计算并显示它的阶乘。
SET SERVEROUTPUT ON;
CREATE OR REPLACE PROCEDURE factorial_number(
n NUMBER) AS
factorial NUMBER;
num Number;
BEGIN
FOR i IN REVERSE 1..n LOOP
num := i - 1;
factorial := factorial * num;
END LOOP;
DBMS_OUTPUT.PUT_LINE (factorial);
EXCEPTION
WHEN OTHERS
THEN DBMS_OUTPUT.PUT_LINE ('Error!');
END;
/
BEGIN
factorial_number(5);
END;
/
怎么样
SQL> CREATE OR REPLACE PROCEDURE factorial_number (n NUMBER)
2 AS
3 factorial NUMBER := 1;
4 BEGIN
5 FOR i IN 1 .. n
6 LOOP
7 factorial := factorial * i;
8 END LOOP;
9
10 DBMS_OUTPUT.PUT_LINE (factorial);
11 END;
12 /
Procedure created.
SQL>
SQL> BEGIN
2 factorial_number (5);
3 END;
4 /
120
PL/SQL procedure successfully completed.
SQL>
- 您未能初始化局部变量
factorial
。未初始化的变量最初是null
并且null
乘以任何值产生null
. - 我不明白你为什么希望你的循环以相反的顺序进行。这无关紧要,因为乘法是共同的,但它不太可能使您的代码更易于阅读/调试/遵循。
- 您不想在循环的每次迭代中从乘以的值中减去 1。例如,当
i = 1
时,您将factorial
乘以 0,这意味着(假设您初始化factorial
),您总是以 0 结束。您想要乘以i
所以不需要局部变量num
.
如果我进行这些修复
CREATE OR REPLACE PROCEDURE factorial_number(
n NUMBER)
AS
factorial NUMBER := 1; -- Initialize
BEGIN
FOR i IN 1..n LOOP -- Loop normally
dbms_output.put_line( 'Beginning iteration ' || i || ' of loop. ' ||
'Factorial = ' || factorial ||
' multiplying by ' || i );
factorial := factorial * i; -- Multiply by i not i-1
END LOOP;
DBMS_OUTPUT.PUT_LINE (factorial);
EXCEPTION
WHEN OTHERS
THEN DBMS_OUTPUT.PUT_LINE ('Error!');
END;
然后
BEGIN
factorial_number(5);
END;
将打印出 120 (5*4*3*2*1
)。
我还添加了一个额外的 dbms_output
行来在循环的每次迭代中打印出变量的当前状态。这是一种相对老派的调试方法。在现代世界中,您将使用调试器遍历代码,您可以在其中查看局部变量的值,但介绍性的 类 最初可能不会教授调试器的用法。