T-SQL | Применение рекурсивной функции (практический пример) |
Один практический пример применения рекурсивной функции -- для расчетов общей суммы банковского вклада и полученных по нему доходов.
Например, есть длительность вклада, % годового дохода и сумма вклада.
/* @years – длительность вклада @accrual – начисляемый годовой доход (%) @amount – изначальная сумма вклада */ Create Function dbo.OverallAmount(@years integer, @accrual float, @amount float) Returns float Begin If @years = 0 Return @amount Return dbo.OverallAmount(@years-1, @accrual, @amount) * (1 + @accrual) End
Рассчитаем на каждый год общую сумму, включая доходы по 5-ти летнему вкладу в 100 000 рублей с годовым доходом 10%:
-- первый год вклада (год размещения денег на депозит) Select dbo.OverallAmount(0, 0.10, 100 000) --100 000
-- второй год вклада (первый год дохода) Select dbo.OverallAmount(1, 0.10, 100 000) --110 000
-- третий год вклада (второй год дохода) Select dbo.OverallAmount(2, 0.10, 100 000) --121 000
-- четвертый год вклада (третий год дохода) Select dbo.OverallAmount(3, 0.10, 100 000) --133 100
-- пятый год вклада (четвертый год дохода) Select dbo.OverallAmount(4, 0.10, 100 000) --146 410
Разберем работу функции на примерах подстановки значений параметров:
OverallAmount(0, 0.10, 100 000) = 100 000
OverallAmount(1, 0.10, 100 000) = OverallAmount(1-1, 0.10, 100 000) * (1 + 0.10), где
OverallAmount(0, 0.10, 100 000) = 100 000
OverallAmount(1, 0.10, 100 000) = 100 000 * 1.10 = 110 000
OverallAmount(2, 0.10, 100 000) = OverallAmount(2-1, 0.10, 100 000) * (1 + 0.10), где
OverallAmount(1, 0.10, 100 000) = OverallAmount(1-1, 0.10, 100 000) * (1 + 0.10), где OverallAmount(0, 0.10, 100 000) = 100 000 OverallAmount(1, 0.10, 100 000) = 100 000 * 1.10 = 110 000
OverallAmount(2, 0.10, 100 000) = 110 000 * 1.10 = 121 000
OverallAmount(3, 0.10, 100 000) = OverallAmount(3-1, 0.10, 100 000) * (1 + 0.10), где
OverallAmount(2, 0.10, 100 000) = OverallAmount(2-1, 0.10, 100 000) * (1 + 0.10), где OverallAmount(1, 0.10, 100 000) = OverallAmount(1-1, 0.10, 100 000) * (1 + 0.10), где OverallAmount(0, 0.10, 100 000) = 100 000 OverallAmount(1, 0.10, 100 000) = 100 000 * 1.10 = 110 000 OverallAmount(2, 0.10, 100 000) = 110 000 * 1.10 = 121 000
OverallAmount(3, 0.10, 100 000) = 121 000 * 1.10 = 133 100
OverallAmount(4, 0.10, 100 000) = OverallAmount(4-1, 0.10, 100 000) * (1 + 0.10), где
OverallAmount(3, 0.10, 100 000) = OverallAmount(3-1, 0.10, 100 000) * (1 + 0.10), где OverallAmount(2, 0.10, 100 000) = OverallAmount(2-1, 0.10, 100 000) * (1 + 0.10), где OverallAmount(1, 0.10, 100 000) = OverallAmount(1-1, 0.10, 100 000) * (1 + 0.10), где OverallAmount(0, 0.10, 100 000) = 100 000 OverallAmount(1, 0.10, 100 000) = 100 000 * 1.10 = 110 000 OverallAmount(2, 0.10, 100 000) = 110 000 * 1.10 = 121 000 OverallAmount(3, 0.10, 100 000) = 121 000 * 1.10 = 133 100
OverallAmount(4, 0.10, 100 000) = 133 100 * 1.10 = 164 410
|