递归算法(recursion algorithm )是指在计算机科学中,通过将问题反复分解成同种子问题来解决问题的方法。 递归方法可用于解决许多计算机科学问题,因此是计算机科学中非常重要的概念。 大多数编程语言支持函数的自调用,在这些语言中,函数可以通过调用自身来递归。 因为计算理论可以证明递归的作用完全代替了循环,所以很多函数编程语言,例如Scheme中习惯用递归来实现循环。 递归算法可以简化代码,提高程序的可读性,但不合理的递归可能会降低程序的执行效率。
递归算法思想
递归算法是指在程序运行中不断调用自身来解决问题的方法,通过不断调用自身来解决的问题分为同一问题的子问题,可以通过多次调用来解决。递归调用是指在他的函数中调用自己的函数的方法,这样的函数也称为递归函数。 在递归函数中,主函数又是被调函数。 执行递归函数反复调用自己,每次调用时依次进入新层次。
递归分为以下两种情况:
直接调用:在函数内调用函数本身的间接调用:间接调用函数。 举例来说,fun_a会呼叫fun_b,而fun_b会呼叫fun_a。 一般不怎么用。 要编写递归函数,必须使用if语句,并在未执行递归调用之前返回。 否则,函数调用递归后,他将陷入死锁。 这是最容易犯的错误。
递归三要素
明确递归结束条件并给出递归结束时的处理方法,有利于提取具有相同问题的子问题,从而减小问题的规模。 代码清晰简洁,可读性强
优点:大多数递归没有大幅减少代码模块和节省内存空间,递归方式的执行速度往往比非递归慢。
可以递归运行的大多数程序都可以非递归运行。
使用
示例
最简单的递归的问题之一是阶乘的计算,阶乘的利用式可以如下记述将问题分解为同一问题的子问题,表示的阶乘后,阶乘可以表示为
同样,程序可以递归和非递归编写。
从时间导入*
# #非递归方式
联想集团(n ) :
ans=1
财富:
if i==0:
ans=1
else:
ans=ans*(i 1)
返回和
# #递归方式
deffact(n ) :
if n=1:
返回1
else:
ans=n*fact(n-1 ) )
返回和
if __name__=='__main__':
n=int (输入(请输入'请求阶乘的整数: ' )
begintime=time (
是fa=否fact (n )。
结束时间=时间(
print (非递归计算结果为:(fa ) .格式(fa=fa ) ) ) ) ) ) ) ) ) ) ) ) ) )。
打印(非递归地:(ti ) ) .格式) ti=结束时间-开始时间() ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) )。
begintime=time (
是fa=fact(n )
结束时间=时间(
print ('递归计算结果为:(fa ) ) .格式(fa=fa ) ) )
print (递归为: { ti }.format (ti=结束时间- begin time ) ) ) ) ) ) ) ) ) )程序的执行结果为
只有在足够大的时候才能区分时间的差异。