遞歸函數

遞歸函數:函數自己本身調用本身,最大的調用層數爲998(能夠import sys模塊   sys.setrecursionlimit(1000000)  增長調用層數)因此須要設置一個明確的斷點;python

遞歸函數的理解:看遞歸函數的時候,最簡單的方法,就是抽絲剝繭,一層函數一層函數的來看,好比下面例子中 斐波那契數列思路二;app

遞歸的使用:遞歸比較少用獲得,基本上平常用到的遞歸,均可以用循環解決。ide

 

實例:函數

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],'\n')
            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],'\n')
            return find(l,aim,start=start,end=mid_index-1)
        else:
            print(l[mid_index],'\n')
            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))
階乘
相關文章
相關標籤/搜索