我不知道我的代碼塊有什么問題來創建一個程序來找出一個數字的階乘。謝謝你。
問題 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;
/
uj5u.com熱心網友回復:
- 您未能初始化區域變數
factorial。未初始化的變數最初是null和乘以null任何值產生的null。 - 我不明白為什么您希望回圈以相反的順序運行。沒關系,因為乘法是交流性的,但它不太可能使您的代碼更易于閱讀/除錯/遵循。
- 您不想從回圈的每次迭代中乘以的值減去 1。如果
i = 1,例如,你乘以factorial0,這意味著(假設你初始化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一行以在回圈的每次迭代中列印出變數的當前狀態。這是一種相對老派的除錯方法。在現代世界中,您可以使用除錯器瀏覽代碼,您可以在其中查看區域變數的值,但介紹性課程最初可能不會教授除錯器的使用。
uj5u.com熱心網友回復:
怎么樣
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>
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/371578.html
