递归和二分算法

Posted Eric

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了递归和二分算法相关的知识,希望对你有一定的参考价值。

递归程序调用自身的编程方法称为递归(recursion)

它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无线的集合。一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。

递归的两个条件:

1,每一次的调用都会使问题的规模有所减少

2,必须有一个明确的终止条件

 

python中测试的递归默认最大深度为998

1 def foo(n):
2     print(n)
3     n += 1
4     foo(n)
5 foo(1)

可以通过以下方法去修改:

技术分享
1 import sys
2 print(sys.setrecursionlimit(100000))
View Code

 

 

二分算法:

二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。

算法要求:

1,必须采用顺序存储结构

2,必须按关键字大小有序排列

 

如果有这样一个列表,让你从这个列表中找到66的位置,你要怎么做?

l = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88]
技术分享
def bin_search(data_list,val):
    low = 0
    high = len(data_list) - 1
    while low <= high:
        mid = (low + high) // 2
        if data_list[mid] == val:
            return mid
        elif data_list[mid] > val:
            high = mid - 1
        else:
            low = mid + 1
    return
ret = bin_search(l,66)
print(ret)
View Code

 

以上是关于递归和二分算法的主要内容,如果未能解决你的问题,请参考以下文章

Day589.二分查找(非递归) -数据结构和算法Java

二分法算法代码

算法递归算法 ② ( 使用递归实现二分法 | if else 编码优化 )

利用二分法实现插入排序算法(二分法使用递归来实现)

二分查找算法(递归与非递归两种方式)

《图解算法》--二分查找选择排序递归