Проблема рекурсивного суммирования по Паскалю - PullRequest
0 голосов
/ 30 сентября 2018

Эта функция является проблемой школьной практики (она работает, но не работает должным образом).

Моя задача - вызвать целое число от пользователя.Когда число прибывает, моя задача состоит в том, чтобы выписать (с помощью рекурсивного алгоритма), какова сумма числа с числами перед данным числом.Например, если наше число равно 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;  

Моя проблема в том, что я не знаю, что является основной проблемой с этим кодом.

Ответы [ 2 ]

0 голосов
/ 30 сентября 2018

Вы просто пытаетесь увеличить 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; 

В большинстве Паскалей вы можете использовать псевдо-переменную 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)

, что то же самое).

0 голосов
/ 30 сентября 2018

Я не знаю, в чем основная проблема этого кода.

Есть несколько проблем с вашим кодом: он итеративный, а не рекурсивный;это слишком сложно;этот цикл:

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.
...