此功能是学校练习题(它正在运行,但无法正常工作)。
我的任务是从用户那里调用一个整数。当数字到达时,我的任务是写出来(带…
我不知道这段代码的主要问题是什么。
你的代码有几个问题:它是迭代的,而不是递归的;这太复杂了;这个循环:
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,所以你实际上在做 for n := 1 to 0 do 。那个循环永远不会运行。不要重复使用 n ,使用另一个变量作为循环索引:
egesszamosszeg
eggesszamosszeg
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 而不是功能名称。通常,这会使打字变得容易一些。
Result
FWIW,您是否知道您可以使这更简单,并且根本不需要递归或迭代?结果可以直接计算:
function egesszamosszeg(n: Integer): Integer; begin result := n * (n + 1) div 2; end;
对于1..10,这将给出 10 * 11 div 2 = 55 太。
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 。 这导致了公式:
(1+10) + (2+9) + (3+8) + (4+7) + (5+6) = 5 * 11 = 55
(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)
这是一样的)。