此功能是学校实践中的问题(正在运行,但无法正常运行。)
我的任务是要求用户提供整数。 当数字到达时,我的任务是写出(使用递归算法) 该数字与给定数字之前的数字之和是多少。 例如,如果我们的人数是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;
我的问题是我不知道这段代码的主要问题是什么。
答案 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)
相同)。