递归函数

递归函数:函数本身自己调用自己,最大的调用层数为998(可以import sys模块   sys.setrecursionlimit(1000000)  增加调用层数)所以需要设置一个明确的断点;

递归函数的理解:看递归函数的时候,最简单的方法,就是抽丝剥茧,一层函数一层函数的来看,比如下面例子中 斐波那契数列思路二;

递归的使用:递归比较少用得到,基本上日常用到的递归,都可以用循环解决。

实例:

import sys
sys.setrecursionlimit(1000000)
n = 0
def story():
    global n
    n +=1
    print(n)
    story()
story()
递归入门-tellstory
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 find(l,aim,start=0,end = None):
    end = len(l)-1 if end == None else end   #find(l,99,start=14,end = 26)
    print('end>>>>',end)
    mid_index = (end-start)//2 + start #中间值 24
    print('start>>>>', start)
    print('mid_index>>>>',mid_index)
    if start <= end:
        if l[mid_index]  < aim :              # 比较 88 和 99
            print(l[mid_index],'
')
            return find(l,aim,start=mid_index+1,end=end)  #find(l,99,start=25,end = 25)
        elif l[mid_index] > aim :
            print(l[mid_index],'
')
            return find(l,aim,start=start,end=mid_index-1)
        else:
            print(l[mid_index],'
')
            return mid_index     #注意此处return是要返回给上一级函数的,不能在此处加多余字符串
    else:
        return '找不到'

print(find(l,88))
二分法查找
#两种思路
#1,用双递归,比较占用运行空间,不过简单易懂:
def fibo(n):
    if n == 1 or n == 2:
        return 1
    else:
        return fibo(n-1) + fibo(n-2)
print(fibo(10))

#2,用单递归,效率快,不过比较绕
def fibo2(n,l=[0]):
    l[0] += 1
    if n == 1 or n == 2:
        l[0] -= 1
        if l[0] == 0:
            return 1
        return 1,1
    else:
        a,b =fibo2(n-1)
        l[0] -= 1
        if l[0] == 0 :
            return a+b
        return b,a+b
print(fibo2(100))
斐波那契数列
#以fibo2(4)为例进行分析
# def fibo2(4,l=[0]):               #得到返回值4
#     l[0] += 1            #1
#     if n == 1 or n == 2:
#         l[0] -= 1
#         if l[0] == 0:
#             return 1
#         return 1,1
#     else:
#         a,b =fibo2(3)   # a,b = fibo2(3)
#         l[0] -= 1
#         if l[0] == 0 :
#             return a+b
#         return b,a+b
#
#
# def fibo2(3,l=[0]):
#     l[0] += 1            #  2
#     if n == 1 or n == 2:
#         l[0] -= 1
#         if l[0] == 0:
#             return 1
#         return 1,1
#     else:
#         a,b =fibo2(n-1)  # a,b = fibo2(2)    #1,2 返回回来 往下执行
#         l[0] -= 1        #  0
#         if l[0] == 0 :
#             return a+b   #3  返回1+2,给fibo2(4)
#         return b,a+b
#
# def fibo2(2,l=[0]):
#     l[0] += 1            #  3
#     if n == 1 or n == 2:
#         l[0] -= 1        #2  此处l[0]因为 n==2要减1
#         if l[0] == 0:
#             return 1
#         return 1,1
#     else:
#         a,b =fibo2(n-1)  # a,b = fibo2(2)   # 1,1返回给 a,b,然后往下执行
#         l[0] -= 1        # 1   此处继续减1,l[0]变为1
#         if l[0] == 0 :
#             return a+b
#         return b,a+b    # 1,2   #返回给 b,a+b       这个再继续返回给fibo2(3)
# print(fibo2(4))
斐波那契思路二分析
#!/usr/bin/env python
#-*-coding=utf-8 -*-
#GKX

menu = {
    '北京': {
        '海淀': {
            '五道口': {
                'soho': {},
                '网易': {},
                'google': {}
            },
            '中关村': {
                '爱奇艺': {},
                '汽车之家': {},
                'youku': {},
            },
            '上地': {
                '百度': {},
            },
        },
        '昌平': {
            '沙河': {
                '老男孩': {},
                '北航': {},
            },
            '天通苑': {},
            '回龙观': {},
        },
        '朝阳': {},
        '东城': {},
    },
    '上海': {
        '闵行': {
            "人民广场": {
                '炸鸡店': {}
            }
        },
        '闸北': {
            '火车战': {
                '携程': {}
            }
        },
        '浦东': {},
    },
    '山东': {},
}

#堆栈的思想
# l = [menu]
# while l:
#     for key in l[-1]:
#         print(key)
#     k = input('input>>').strip()   # 北京
#     if k in l[-1].keys() and l[-1][k]:l.append(l[-1][k])
#     elif k == 'b':
#         l.pop()
#     elif k == 'q':
#         break

#递归的思想
def three_level_menu(menu):
    while True:
        for key in menu:
            print(key)
        k=input('>>>')
        if k=='q':return 'q'
        elif k=='b':break
        elif k in menu:
            ret=three_level_menu(menu[k])
            if ret=='q':return 'q'
three_level_menu(menu)
三级菜单
#阶乘
def fac(n):
    if n == 1:
        return 1
    else:
        return n*fac(n-1)
print(fac(10))
阶乘
原文地址:https://www.cnblogs.com/gkx0731/p/9577851.html