问题:
1.算法的时间复杂度是多少
2.递归会有什么缺点
3.不用递归能否实现,复杂度能否降到O(1)
递归算法:
func sum(value:Int) ->Int{
guard value>0 else{
return0
}
return value+sum(value: value-1)
}
let result=sum(value:100)
print(result) // ----(5050)
回答:
1.递归时间复杂度:O(n)
2.优点:
. 简洁
.在树的前序,中序,后序遍历算法中,递归的实现明显要比循环简单得多。
缺点:
递归太深的话, 资源不够, 或者直接栈溢出;
系统在每次递归前都要保护现场, 资源占用比其他调用高很多;
可读性可能很好, 可能很差, 差到不得不debug才能看清逻辑;
.递归由于是函数调用自身,而函数调用是有时间和空间的消耗的:每一次函数调用,都需要在内存栈中分配空间以保存参数、返回地址以及临时变量,而往栈中压入数据和弹出数据都需要时间。->效率
.递归中很多计算都是重复的,由于其本质是把一个问题分解成两个或者多个小问题,多个小问题存在相互重叠的部分,则存在重复计算,如fibonacci斐波那契数列的递归实现。->效率
.调用栈可能会溢出,其实每一次函数调用会在内存栈中分配空间,而每个进程的栈的容量是有限的,当调用的层次太多时,就会超出栈的容量,从而导致栈溢出。->性能
3.不用递归,可以用循环实现求和。
可以复杂度降到O(1),利用求和公式计算。
func formula(n:Int) ->Int{
return (n+1)*n/2
}