Вычислить n-ый член последовательности, заданной рекуррентной формулой (рекурсия/итерация) - Pascal
Формулировка задачи:
нужно было написать прогу с рекурсией и без, считающую n-ый член последовательности , которая определяется рекуррентной формулой: a1=1, a2=2, a3=3, a[n+1]=3a[n]+2a[n-3]+a[n-2]
В процедуре без рекурсии все нормально, считает правильно, а в процедуре с рекурсией пришет ошибку переполнения стека, помогите найти выход, а то у меня уже нет мыслей даже по этому поводу
вот код:
Решение задачи: «Вычислить n-ый член последовательности, заданной рекуррентной формулой (рекурсия/итерация)»
textual
Листинг программы
В смысле вводится ещё, сколько первых элементов равны номеру или что - не очень понятно? Тогда так uses crt; var q,n:integer; a_bez_r:integer; a_s_recurs:integer; function bez_recurs(q,n:integer):integer; var a:array [0..10] of integer; i:integer; begin for i:=0 to q do a[i]:=i; for i:=q+1 to n do a[i]:=3*a[i-1]+2*a[i-4]+a[i-3]; bez_recurs:=a[n]; end; function s_recurs(q,n:integer):integer; begin if n<=q then s_recurs:=n else s_recurs:=3*s_recurs(q,n-1)+2*s_recurs(q,n-4)+s_recurs(q,n-3); end; begin clrscr; write('q='); readln(q); write('n='); readln(n); a_bez_r:=bez_recurs(q,n); a_s_recurs:=s_recurs(q,n); writeln(' bez recursii ->',a_bez_r); writeln(' s recursiey -> ',a_s_recurs); readln; end.
Объяснение кода листинга программы
- Программа начинается с объявления переменных q, n типа integer и a_bez_r, a_s_recurs типа integer.
- Далее объявляется функция bez_recurs, которая принимает два аргумента типа integer q и n. Внутри функции объявляется массив a размером 11 элементов и переменная i типа integer.
- В первой части функции заполняется массив a первыми q элементами, равными их индексам.
- Во второй части функции заполняются остальные элементы массива a начиная с индекса q+1 и используя рекурсивную формулу a[i] = 3a[i-1] + 2a[i-4] + a[i-3].
- В конце функции возвращается значение a[n].
- Далее объявляется функция s_recurs, которая также принимает два аргумента типа integer q и n.
- Внутри функции происходит рекурсивный вызов функции s_recurs, пока значение n не станет меньше или равным q.
- В конце функции возвращается значение n.
- В основной части программы происходит ввод значений q и n с помощью функции readln.
- Затем вызывается функция bez_recurs с введенными значениями q и n для вычисления значения a_bez_r.
- После этого вызывается функция s_recurs с введенными значениями q и n для вычисления значения a_s_recurs.
- Значения a_bez_r и a_s_recurs выводятся на экран с помощью функции writeln.
- Программа завершается с помощью функции readln.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д