python递归函数例题_Python递归函数、闭包和装饰器

目录:

一、递归函数

二、闭包的深入讲解

三、装饰器的使用

一、 递归函数

递归函数recursion

1.什么是递归函数

函数直接或间接的调用自己本身

可有解决循环上的问题

importtime

defstory():

time.sleep(2)

print('从前有座山')

print('山上座庙')

print("庙里有个老和尚在讲故事")

story()

story()

间接性的调用自己

deffa():

fb()

deffb():

fa()

fa()

递归说明

递归一定要控制递归的层数,当符合某一条件时要终止递归,几乎所有的递归都能用while循环来代替。

递归的优缺点:

优点:

递归可以把问题简单化,让思路更加清晰,代码更加简洁。

缺点:

递归因系统环境影响大,当递归过深,可能会得到不可预知的结果。

#求和1+2+3+......+98+99+100

#如果说100,它是不是就相关于1+99的结果

defmysum(x):

ifx<=1:

return1

returnx+mysum(x-1)

v =mysum(100)

print(v)

在函数内部,可以调用其他函数。如果一个函数在内部调用自己本身,这个函数就是递归函数,递归会形成一个深度循环!

2、 递归函数的使用

举个例子:

我们来计算阶乘 n! = 1 * 2 * 3 * ... * n

什么是阶乘呢?

4!= 4*3*2*1

5! =5*4*3*2*1

n! = 1 * 2 * 3 * ... * n

while解决方案:

n =int(input('请输入一个数:'))

result =1

i =1

whilei<=n:

result =result*i

i +=1

print(result)

紧接着我们看下阶乘的规律:

1! = 1

2! = 2 × 1 = 2 × 1!

3! = 3 × 2 × 1 = 3 × 2!

4! = 4 × 3 × 2 × 1 = 4 × 3! ...

n! = n × (n-1)!

defgetNum(num):

ifnum>1:

returnnum*getNum(num-1)

else:

returnnum

print(getNum(5))

3、递归函数经典案例(面试):

题目:斐波那契数列,该数列中有n个数字,1 1 2 3 5 8

分析:该数列中,从第三个数字开始:数值 = 前一个数字 + 前 前面一个数字

方法1:

deffeibo(n):

a,b =0,1

c =[]

whilen>0:

c.append(b)

a,b =b,a+b

n-=1

print(c)

feibo(12)

递归版:

deffeibo(n):

ifn==1 or n==2:

return1

elifn==2:

return1

return(feibo(n-1)+feibo(n-2))

n =int(input('请输入:'))

a =[feibo(i) fori inrange(1,n+1)]

print(a)

扩充面试题目:

如何获取计算机当中的最大的递归层数?

import sys

查看递归深度

sys.getrecursionlimit()

3000

设置递归深度

sys.setrecursionlimit(500)

sys.getrecursionlimit()

500

二、闭包 closure

闭包定义:

将内嵌函数的语句和这些语句的执行环境打包在一起时,得到的对象称为闭包(closure)

闭包满足的三个条件:

1.必须有内嵌函数;

2.内嵌函数必须引用外部函数中的变量

3.外部函数返回值必须是内嵌函数

通过这三点,就可以创建一个闭包,提别注意:Python装饰器就是使用了闭包。

defmake_power(y):

deffx(arg):

returnarg**y

returnfx

闭包的好处:

使代码变得简洁;提高代码的拓展性;

defmake_power(y):

deffx(arg):

returnarg**y

returnfx

pow2 =make_power(2)

print('3的平方 是',pow2(3))

defwrapperfun(strname):

defrecoder(age):

print('姓名',strname,'年龄',age)

returnrecoder

#将strname设置为If

fun =wrapperfun('if')

#将age赋值 ,输出

fun(28)

装饰器 decorators(专业提高篇)

装饰器的定义

装饰器是程序开发中经常会用到的一个功能,用来在原有的函数上增添新的代码需求。

‘开发封装’

语法 :

def装饰器函数名(参数):

语句块

return函数对象

被装饰函数的语法:

@装饰器的函数名

def函数名(形参列表):

语句块

#定义一个装饰器

defmydeo(fn):

deffx():

print('......................')

fn()

print('***********************')

returnfx

@mydeo

defmyfunc():

print('myfunc被调用')

myfunc()

应用场景:

1、当我们已经写好一个函数时,项目也已经上线了,突然客户想要增添一个需求,让这个函数处理的更加细致,这个就可以用到装饰器了;

案例:

#装饰器快速入门假如现在我们定义了两个函数,分别来打印他们的名字。

defouter(func):

definner():

func()

print('come from hebei')

returninner

@outer

deffunc1():

print('this is python1)

@outer

deffunc2():

print('this is python2')

func1()

func2()

d788d43f8794a4c2e1dee3568d269ad3ac6e3922.jpeg?token=d5ebe8caa7a755cd1d5bd8c18dd3e8d0

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值