Recursion 帕斯卡递归求和函数学校实习题

Recursion 帕斯卡递归求和函数学校实习题,recursion,pascal,lazarus,freepascal,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 ege

此功能是一个学校实践问题,它正在运行,但无法正常工作

我的任务是从用户那里调用一个整数。 当数字到达时,我的任务是用递归算法写出 数字与给定数字之前的数字之和是多少。 例如,如果我们的数字是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;  
我的问题是,我不知道这段代码的主要问题是什么

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

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

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.
您只是在尝试递增egesszamosszeg。您不能使用一个更简单的名称吗?而不是向其添加连续的数字。但是您的循环是错误的:eggesszamosszeg是0,所以您实际上是在为n:=1:0做。这个循环永远不会运行。不要重复使用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; 
在大多数PASCAL中,可以使用伪变量Result而不是函数名。通常,这会使打字更容易一些

FWIW,你知道你可以让它变得简单一点,而且根本不需要递归或迭代吗?可直接计算结果:

function egesszamosszeg(n: Integer): Integer;
begin
  result := n * (n + 1) div 2;
end;
对于1..10,也将给出10*11 div 2=55

见:

实际上,你计算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)

这是一样的

我不同意你简单地增加egesszamosszeg,因为循环从未按设计运行。这一点很小,但却是代码设计问题的核心。@cdlane:你说得对。起初,它看起来像是一个有效的循环,但这永远不会起作用。查看my edits.FWIW,您可能应该了解如何正确缩进和格式化代码。由于函数名和变量名不寻常,因此很难阅读。