用于for循环的递归(pascal)

时间:2015-10-22 01:22:04

标签: recursion pascal freepascal

我正在尝试使用递归的概念但是使用for do循环。但是我的程序无法做到。例如,如果我想输出4!答案应该是24但我的输出是12.有人可以帮助我吗?

 program pastYear;

 var
   n,i:integer;


 function  calculateFactorial ( A:integer):real;

 begin
   if A=0 then
     calculateFactorial := 1.0
   else
     for i:= A downto 1 do
     begin
       j:= A-1;
       calculateFactorial:= A*j;
     end;
   end;

   begin
     writeln( ' Please enter a number ');
     readln ( n);
     writeln ( calculateFactorial(n):2:2);
     readln;
   end.

1 个答案:

答案 0 :(得分:2)

您的代码中存在几个问题。

  1. 首先,它不会编译,因为您正在访问未定义的变量j
  2. 使用循环计算阶乘是迭代的方法。您正在寻找递归方式。
  3. 什么是递归?递归函数调用自身。因此,在您的情况下calculateFactorial需要调用自己。

    如何声明阶乘函数?

    enter image description here

    用语言说:

      

    n的阶乘被声明为

         
        当n等于0 时,
    • 1   
    • n-1大于n时,n的阶乘乘以0
    •   

    所以你看到阶乘函数的定义已经是递归的,因为当n大于0时,它就是指自己。

    这可以用于Pascal代码:

    function Factorial(n: integer): integer;
    begin
      if n = 0 then
        Result := 1
      else if n > 0 then
        Result := Factorial(n - 1) * n; 
    end;
    

    不,我们可以做一些优化:

    • 阶乘函数不适用于负数。因此,我们将数据类型从integer(可以表示负数)更改为longword(只能表示正数)。
    • longword可存储的最大值为4294967295,是longint可存储的两倍。
    • 现在我们不需要关心负数,我们可以减少一个if语句。

    结果如下:

    function Factorial(n: longword): longword;
    begin
      if n = 0 then
        Result := 1
      else 
        Result := Factorial(n - 1) * n; 
    end;