Recursion 帕斯卡递归求和函数学校实习题
此功能是一个学校实践问题,它正在运行,但无法正常工作 我的任务是从用户那里调用一个整数。 当数字到达时,我的任务是用递归算法写出 数字与给定数字之前的数字之和是多少。 例如,如果我们的数字是10,那么结果是55,因为1+2+3+4+5+6+7+8+9+10=55,等等 我已经尝试编写以下代码: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
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,您可能应该了解如何正确缩进和格式化代码。由于函数名和变量名不寻常,因此很难阅读。