繁体   English   中英

PL/SQL CREATE PROCEDURE - 阶乘

[英]PL/SQL CREATE PROCEDURE - factorial

我不知道我的代码块有什么问题来创建一个程序来找出一个数字的阶乘。 谢谢你。

-- 问题 1 - 编写一个存储过程,它获取一个 integer 数字 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. 我不明白你为什么希望你的循环以相反的顺序到达 go。 没关系,因为乘法是可交流的,但它不太可能使您的代码更易于阅读/调试/遵循。
  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行,以在循环的每次迭代中打印出变量的当前 state。 这是一种相对老式的调试方法。 在现代世界中,您将使用调试器浏览代码,您可以在其中查看局部变量的值,但入门类最初可能不会教授调试器的使用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM