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

 

 


 



© 2018 | Анна Петросян | pashelp@yandex.ru