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


敢嫁就敢娶
2025-01-14 12:08:40 (2月前)


此功能是学校练习题(它正在运行,但无法正常工作)。

我的任务是从用户那里调用一个整数。
当数字到达时,我的任务是写出来(带…

3 条回复
  1. 0# 十二* | 2019-08-31 10-32




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




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




    1. for n:=1 to egesszamosszeg do

    2. </code>


    有效地:




    1. for n:=1 to 0 do

    2. </code>


    考虑这个简单的函数,它有效地实现了你的问题的要点:




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

    2. if (n > 1) then
    3.     egesszamosszeg := egesszamosszeg + egesszamosszeg(n - 1);
    4. end;

    5. begin
      writeln(egesszamosszeg(10));
      end.

    6. </code>

  2. 1# 小它.Little it | 2019-08-31 10-32



    你很简单

    试图增加


    egesszamosszeg



    你不能用一个更简单的名字

    ?),而不是添加连续的数字。但你的循环错了:

    eggesszamosszeg

    是0,所以你实际上在做

    for n := 1 to 0 do

    。那个循环永远不会运行。不要重复使用

    n

    ,使用另一个变量作为循环索引:




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

    2. </code>


    但是你说它必须是递归的,所以它必须用不同的参数值来调用它自己。然后做一些事情:




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

    2. </code>



    在大多数Pascals中,您可以使用伪变量

    Result

    而不是功能名称。通常,这会使打字变得容易一些。





    FWIW,您是否知道您可以使这更简单,并且根本不需要递归或迭代?结果可以直接计算:




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

    2. </code>


    对于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


    这导致了公式:




    1. sum = n
      (n + 1) div 2

    2. </code>


    (或实际上:




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

    2. </code>


    这是一样的)。


登录 后才能参与评论