用递归写一个算法,计算从1到100的和

问题:

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

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。