递归函数

初识递归函数

初识递归

	def story():
		print('从前有座山山里有座庙庙里有个老和尚')
		story()
  • 在函数中调用自己,就是递归函数
  • 最大递归深度998,最大递归深度可以修改
  • 优点:让代码变得简单
  • 缺点:占用内存

  • 分析问题

      #递归小例子,求年龄
      '''
      小明多大?   n=1 age(1) = age(1+1) +2 >> age(n+1) +2
      比小芳大两岁
      小芳多大?   n=2 age(2) = age(2+1) +2 >> age(n+1) +2
      比小猪大两岁
      小猪多大?   n=3 age(3) = age(3+1) +2 >> age(n+1) +2
      比小王大两岁
      小王多大?   n=4
      40岁
      '''
      #定义递归函数
      def age(n):
          if n == 4:
              return 40
          elif n > 0:
              return age(n+1) + 2
      #调用
      print(age(3))	#给age一个参数完成计算
    

初识算法

  • 计算的方法

      99 * 13 = 100 * 13 - 13 = 1300 - 13 = 1287 
    
  • 查找

  • 排序

  • 最短路径问题

二分查找算法

- 必须处理有序的数列
		
		#二分查找算法
		def er_fen(num, iter, start=0, end=None):
		    end = len(iter) if end is None else end #确保end不是一个常量
		    mid_index = (end - start)//2 + start    #目标索引位置
		    if start <= end:
		        if num == iter[mid_index]:
		            return '位置在{}'.format(mid_index)
		        elif num > iter[mid_index]:
		            return er_fen(num, iter, start=mid_index+1, end=end)
		        elif num < iter[mid_index]:
		            return er_fen(num, iter, start=start, end=mid_index - 1)
		    else:
		        return '没有这个数!'
		li = [0, 1, 2, 3, 4, 8, 10, 33, 49,  1234, 3443]
		
		#调用
		print(er_fen(10, li))
		print(er_fen(100, li))
		#结果
		位置在6
		没有这个数

斐波那蝎数列

  • 返回值

递归案例

  1. 三级菜单 -吊的一批
    • 利用了return的作用

        dic = {
            '大城市': {
                '北京': {
                    '一环': {},
                    '二环': {},
                    '郊区': {}
                },
                '上海': {
                    '东方明珠': {},
                    '珠江路': {},
                    '哈哈路': {}
                }
             },
            '小城市': {
                '阜阳': {
                    '界首市': {},
                    '临泉县': {}
                    },
                '合肥': {
                    '明光路': {},
                    '虹桥机场': {},
                    '香格里拉': {}
                }
            }
        }
        
        def func(d):
            while 1:
                for i in d:
                    print(i)
                name = input('>>').strip()
                if name == 'q' or name == 'b':
                    return name
                elif name in d.keys() and d[name]:
                    ret = func(d[name])
                    if ret == 'q':
                        return 'q'
                elif not d.get(name) or not d[name]:
                    continue
        func(dic)
      
    • 利用堆栈实现三级菜单

        l = [dic]	#dic是上面的数据
        while l:
            for i in l[-1]:
                print(i)
            k = input('>>').strip()
            if k in l[-1].keys() and l[-1]:
                l.append(l[-1][k])
            elif k =='b':
                l.pop()
            elif k == 'q':
                break
           else:
           	print('输入不正确,重新输入!')
      
posted @ 2018-09-06 16:23  小白的蟒蛇  阅读(117)  评论(0编辑  收藏  举报