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>
  1. 您未能初始化局部变量 factorial。未初始化的变量最初是 null 并且 null 乘以任何值产生 null.
  2. 我不明白你为什么希望你的循环以相反的顺序进行。这无关紧要,因为乘法是共同的,但它不太可能使您的代码更易于阅读/调试/遵循。
  3. 您不想在循环的每次迭代中从乘以的值中减去 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 行来在循环的每次迭代中打印出变量的当前状态。这是一种相对老派的调试方法。在现代世界中,您将使用调试器遍历代码,您可以在其中查看局部变量的值,但介绍性的 类 最初可能不会教授调试器的用法。