初识递归

  • 递归的定义——在一个函数里再调用这个函数本身
  • 递归的最大深度——997
    1. def foo(n):
    2. print(n)
    3. n += 1
    4. foo(n)
    5. foo(1)
    Python
    Copy
    997 是 python 为了我们程序的内存优化所设定的一个默认值,我们当然还可以通过一些手段去修改它。
    1. import sys
    2. print(sys.setrecursionlimit(10000))
    3. def foo(n):
    4. print(n)
    5. n += 1
    6. foo(n)
    7. foo(1)
    Python
    Copy
    将 python 允许的递归深度设置为了 1w,至于实际可以达到的深度就取决于计算机的性能了。
    不推荐修改这个默认的递归深度,因为如果用 997 层递归都没有解决的问题是不适合使用递归来解决。

    汉诺塔问题

    从左到右 A B C 柱 大盘子在下, 小盘子在上, 借助 B 柱将所有盘子从 A 柱移动到 C 柱, 期间只有一个原则: 大盘子只能在小盘子的下面.
    我们只需要考虑如果有 64 层,先将 A 柱上的 63 层移动到 B 柱上,然后将 A 柱的第 64 个移动到 C 柱上,然后将 B 柱上的 63 层移动到 C 柱上即可。
    那怎么把 63 层都移到 B 柱上,这个问题可以用上面相同的方法解决。
    1. def move(n,a,b,c):
    2. if n == 1:
    3. print(a,'->',c)
    4. else:
    5. # 将n-1个胖子从a --> b
    6. move(n-1,a,c,b)
    7. # 将剩余的最后一个盘子从a --> c
    8. print(a,'->',c)
    9. # 将剩余的n-1个盘子从 b --> c
    10. move(n-1,b,a,c)
    11. n = int(input('请输入汉诺塔的层数:'))
    12. move(n,'A','B','C')
    Python
    Copy
    递归实现三级菜单
    1. menu = {
    2. '山东': {
    3. '青岛': ['四方', '黄岛', '崂山', '李沧', '城阳'],
    4. '济南': ['历城', '槐荫', '高新', '长青', '章丘'],
    5. '烟台': ['龙口', '莱山', '牟平', '蓬莱', '招远']
    6. },
    7. '江苏': {
    8. '苏州': ['沧浪', '相城', '平江', '吴中', '昆山'],
    9. '南京': ['白下', '秦淮', '浦口', '栖霞', '江宁'],
    10. '无锡': ['崇安', '南长', '北塘', '锡山', '江阴']
    11. },
    12. '浙江': {
    13. '杭州': ['西湖', '江干', '下城', '上城', '滨江'],
    14. '宁波': ['海曙', '江东', '江北', '镇海', '余姚'],
    15. '温州': ['鹿城', '龙湾', '乐清', '瑞安', '永嘉']
    16. },
    17. '安徽': {
    18. '合肥': ['蜀山', '庐阳', '包河', '经开', '新站'],
    19. '芜湖': ['镜湖', '鸠江', '无为', '三山', '南陵'],
    20. '蚌埠': ['蚌山', '龙子湖', '淮上', '怀远', '固镇']
    21. },
    22. '广东': {
    23. '深圳': ['罗湖', '福田', '南山', '宝安', '布吉'],
    24. '广州': ['天河', '珠海', '越秀', '白云', '黄埔'],
    25. '东莞': ['莞城', '长安', '虎门', '万江', '大朗']
    26. },
    27. '测试': {}
    28. }
    29. def threeLM(dic):
    30. while True:
    31. for k in dic:print(k)
    32. key = input('input>>').strip()
    33. if key == 'b' or key == 'q':return key
    34. elif key in dic.keys() and dic[key]:
    35. ret = threeLM(dic[key])
    36. if ret == 'q': return 'q'
    37. threeLM(menu)
    38. # l = [menu]
    39. # while l:
    40. # for key in l[-1]:print(key)
    41. # k = input('input>>').strip() # 北京
    42. # if k in l[-1].keys() and l[-1][k]:l.append(l[-1][k])
    43. # elif k == 'b':l.pop()
    44. # elif k == 'q':break
    Python
    Copy

    二分查找算法

    如果想在列表中查找某个数字,可以排序后从中间开始查找
    python递归函数与二分查找 - 图1
    1. 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]
    2. # def func(l,aim):
    3. # mid = (len(l)-1)//2
    4. # if l:
    5. # if aim > l[mid]:
    6. # func(l[mid+1:],aim)
    7. # elif aim < l[mid]:
    8. # func(l[:mid],aim)
    9. # elif aim == l[mid]:
    10. # print("找到了",mid)
    11. # else:
    12. # print('找不到')
    13. # func(l,66)
    14. # func(l,6)
    15. def search(num,l,start=None,end=None):
    16. start = start if start else 0
    17. end = len(l)-1 if end is None else end
    18. mid = (end - start)//2 + start
    19. if start > end:
    20. return None
    21. elif l[mid] > num :
    22. return search(num,l,start,mid-1)
    23. elif l[mid] < num:
    24. return search(num,l,mid+1,end)
    25. elif l[mid] == num:
    26. return mid
    27. ret = search(18,l)
    28. print(ret)