递归:指在当前方法内调用自己,设置停止条件的这种现象。
递归的分类: 递归分为两种,直接递归和间接递归。
优点:使用递归编写的程序简洁、结构清晰,程序的正确性很容易证明,不需要了解递归调用的具体细节。
缺点:递归函数在调用的过程中,每一层调用都需要保存临时性变量和返回地址、传递参数,因此递归函数的执行效率低。
简单递归
求n的阶乘、斐波那契数列、求n个数的最大、数制转换、求最大公约数都属于简单递归。
计算阶乘:例如 n = 3
结果为 3 x 2 x 1 = 6n = 5 . 结果为 5 x 4 x 3 x 2 x 1 = ...
定义n m变量。求n的阶乘
def recursive n
puts "-----------n is #{n}------"
#设置停止的条件
if n == 1
return 1
end
#不停止就调用自身 recursive n
result = n * recursive(n - 1)
puts "---------result is #{result} ----n-1 is #{n - 1}"
return result
end
#设置m的初始值为0.递增
#调用方法 实现 阶乘
puts recursive 4
puts "----------------分割线===============for in"
#定义变量n 求n的阶乘 使用for in的方法
def recursive_for_in n
puts "-------------n is #{n}"
#设置停止条件 n=1时 停止
if n == 1
return 1
end
#调用自身方法实现阶乘
for i in 2..n
result = i * recursive_for_in(i - 1)
puts "result is #{result} -------i is #{i}"
end
return result
end
puts recursive_for_in 5
puts "-============================分割线-------------------loop do"
#定义变量n 求n的阶乘,使用loop do的方法
def recursive_loop_do n
puts "-----n is #{n}------"
result = 0
loop do
puts "---------n is #{n}"
#调用自身方法
if result == 0
puts "-------result = n*(n-1) result is #{ n*(n - 1)}"
result = n * (n - 1)
else
puts "----------result = result * (n-1) result is #{result * (n - 1)}"
result = result * (n - 1)
end
#设置停止条件
n = n - 1
if (n -1) == 0
break
end
end
return result
end
puts recursive_loop_do 4