递归函数

Posted gkx0731

tags:

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

递归函数:函数本身自己调用自己,最大的调用层数为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))
阶乘

 

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

vue递归组件的一些理解

哈斯克尔。我很困惑这个代码片段是如何工作的

如何在自定义PyYAML构造函数中处理递归?

JavaSE 方法的使用

JavaScript - 代码片段,Snippets,Gist

Java基础之方法的调用重载以及简单的递归