pl/sql 中数字的阶乘(未显示正确的输出)

Factorial of a number in pl/sql (Not showing the correct output)

我在 pl/sql 中写下了代码,但没有显示输出 这段代码有问题。

declare

num number(20):= 0;
val number(10):= 5;
temp number(10):= 0;

function factorial (n1 in number)
return number
is
fact number(10):= 1;

begin
temp:= n1;
loop
  if fact <=0 then
     exit;
  else
     fact := fact *temp;
     temp:=temp-1;
  end if;
end loop;
return fact;
end;

begin
num:= factorial(val);
dbms_output.put_line('Factorial of ' ||val||' is '||num);
end;

输出:- 5 的阶乘为 0

您正在检查 fact <= 0 而不是检查 temp <= 0 并且您还应该在函数本地声明 temp 变量:

declare
  val number(10):= 5;

  function factorial (n1 in number)
  return number
  is
    fact number(10) := 1;
    temp number(10) := n1;
  begin
    loop
      if temp <=0 then
        exit;
      else
        fact := fact *temp;
        temp:=temp-1;
      end if;
    end loop;
    return fact;
  end;
begin
  dbms_output.put_line('Factorial of ' ||val||' is '|| factorial(val) );
end;
/

或者,更简单地说:

declare
  val number(10):= 5;

  function factorial (n1 in number)
  return number
  is
    fact number(10) := 1;
  BEGIN
    FOR temp IN 2 .. n1
    LOOP
      fact := fact *temp;
    END LOOP;
    RETURN fact;
  END;
begin
  dbms_output.put_line('Factorial of ' ||val||' is '|| factorial(val) );
end;
/

db<>fiddle here

行:

if fact <=0 then

应该是:

if temp <=0 then

你真的不需要 'else' 部分,因为 'if' 无论如何都会退出循环;所以你可以这样做:

loop
  if temp <=0 then
     exit;
  end if;
  fact := fact *temp;
  temp:=temp-1;
end loop;

或者使用 while 循环避免显式检查:

while temp > 0 loop
  fact := fact *temp;
  temp:=temp-1;
end loop;

...等等

db<>fiddle