mirror of
http://bgp.hk.skcks.cn:10086/https://github.com/krahets/hello-algo
synced 2026-04-20 21:00:58 +08:00
71 lines
2.0 KiB
Ruby
71 lines
2.0 KiB
Ruby
=begin
|
||
File: recursion.rb
|
||
Created Time: 2024-03-30
|
||
Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
|
||
=end
|
||
|
||
### Рекурсия ###
|
||
def recur(n)
|
||
# Условие завершения
|
||
return 1 if n == 1
|
||
# Рекурсия: рекурсивный вызов
|
||
res = recur(n - 1)
|
||
# Возврат: вернуть результат
|
||
n + res
|
||
end
|
||
|
||
### Имитация рекурсии итерацией ###
|
||
def for_loop_recur(n)
|
||
# Использовать явный стек для имитации системного стека вызовов
|
||
stack = []
|
||
res = 0
|
||
|
||
# Рекурсия: рекурсивный вызов
|
||
for i in n.downto(0)
|
||
# Имитировать «рекурсию» с помощью операции помещения в стек
|
||
stack << i
|
||
end
|
||
# Возврат: вернуть результат
|
||
while !stack.empty?
|
||
res += stack.pop
|
||
end
|
||
|
||
# res = 1+2+3+...+n
|
||
res
|
||
end
|
||
|
||
### Хвостовая рекурсия ###
|
||
def tail_recur(n, res)
|
||
# Условие завершения
|
||
return res if n == 0
|
||
# Хвостовой рекурсивный вызов
|
||
tail_recur(n - 1, res + n)
|
||
end
|
||
|
||
### Последовательность Фибоначчи: рекурсия ###
|
||
def fib(n)
|
||
# Условие завершения: f(1) = 0, f(2) = 1
|
||
return n - 1 if n == 1 || n == 2
|
||
# Рекурсивный вызов f(n) = f(n-1) + f(n-2)
|
||
res = fib(n - 1) + fib(n - 2)
|
||
# Вернуть результат f(n)
|
||
res
|
||
end
|
||
|
||
### Driver Code ###
|
||
if __FILE__ == $0
|
||
n = 5
|
||
|
||
res = recur(n)
|
||
puts "\nРезультат суммирования в рекурсивной функции res = #{res}"
|
||
|
||
res = for_loop_recur(n)
|
||
puts "\nРезультат суммирования при имитации рекурсии res = #{res}"
|
||
|
||
res = tail_recur(n, 0)
|
||
puts "\nРезультат суммирования в хвостовой рекурсии res = #{res}"
|
||
|
||
res = fib(n)
|
||
puts "\n#{n}-й элемент последовательности Фибоначчи: #{res}"
|
||
end
|