Pascal递归求和函数学校实践问题

时间:2018-09-30 19:19:57

标签: recursion pascal lazarus freepascal

此功能是学校实践中的问题(正在运行,但无法正常运行。)

我的任务是要求用户提供整数。 当数字到达时,我的任务是写出(使用递归算法) 该数字与给定数字之前的数字之和是多少。 例如,如果我们的人数是10,那么结果是55,因为1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 = 55,等等。

我已经尝试编写以下代码:

function egesszamosszeg(n:integer) : integer;
begin
    egesszamosszeg:=0
    if n=1 then 
        egesszamosszeg:=1
    else
        for n:=1 to egesszamosszeg do
        begin
            egesszamosszeg:=egesszamosszeg+1;
        end; 
end;

procedure TForm1.Button1Click(Sender: TObject); 
var egesszam:integer; 
begin
    egesszam:=strtoint(Inputbox('','Give an integer please!',''));
    Showmessage(inttostr(Egesszamosszeg(egesszam))); 
end;  

我的问题是我不知道这段代码的主要问题是什么。

2 个答案:

答案 0 :(得分:0)

  

我不知道这段代码的主要问题是什么。

您的代码有几个问题:它是迭代的,而不是递归的;这太复杂了;此循环:

for n:=1 to egesszamosszeg do

有效:

for n:=1 to 0 do

考虑这个简单的功能,可以有效地实现您的问题要点:

function egesszamosszeg(n:integer) : integer;
begin
    egesszamosszeg := n;

    if (n > 1) then
        egesszamosszeg := egesszamosszeg + egesszamosszeg(n - 1);
end;

begin
    writeln(egesszamosszeg(10)); 
end.

答案 1 :(得分:0)

您只是在尝试增加 egesszamosszeg您不能使用更简单的名称吗?),而不是在其上添加连续的数字。但是您的循环是错误的:eggesszamosszeg为0,因此实际上您在做for n := 1 to 0 do。该循环永远不会运行。不要重复使用n,请使用另一个变量作为循环索引:

for i := 1 to n do 
  egesszamosszeg := egesszamosszeg + i;

但是您说它必须是递归的,因此它必须使用不同的参数值来调用自身。然后执行以下操作:

function egesszamosszeg(n: integer): integer;
begin
  if n = 1 then // terminating condition
    egesszamosszeg := 1  
  else
    egesszamosszeg := n + egesszamosszeg(n - 1); // recursion
end; 

在大多数Pascals中,可以使用伪变量Result代替函数名。通常,这样会使键入变得更容易。


FWIW,您知道您可以简化一点,并且完全不需要递归或迭代吗?结果可以直接计算:

function egesszamosszeg(n: Integer): Integer;
begin
  result := n * (n + 1) div 2;
end;

对于1..10,这也会给10 * 11 div 2 = 55

请参阅:https://www.wikihow.com/Sum-the-Integers-from-1-to-N

实际上,您计数(1+10) + (2+9) + (3+8) + (4+7) + (5+6) = 5 * 11 = 55。您可以对任何正数执行相同的操作。与1..6相同:(1+6) + (2+5) + (3+4) = 3 * 7 = 21。 得出公式:

sum = n * (n + 1) div 2 

(或实际上:

n div 2 * (n+1) // mathematically: n/2 * (n+1)

相同)。