c++ 匿名函数_匿名函数、递归函数(函数篇-下)

递归函数:递归指由一种(或多种)简单的基本情况定义的一类对象或方法,并规定其他所有情况都能被还原为其基本情况。(说白了就是函数自己调用自己)

我们应该都听过下面这一段话:

“从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?“从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?‘从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?… ”

这就是一个递归的过程,故事内容一直都是 '从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!' 但是讲故事和听故事的对象却一直在发生变化,归结下来就是一个老和尚给一个小和尚在讲故事。

递归在数学计算中的例子也有很多,最典型的就是求 斐波拉契数列和阶乘。

下面,我们就话不多说,先通过案例来认识---递归。然后在通过这个案例来解释--递归

例如我们要求 5 的阶乘
一般方法
def yiban():
   k = 1
   result = 1
   while k<=5:
       result = result*k
       k = k+1
   print(result)
yiban()
以上内容只能说是利用了迭代,并没有用到递归。

递归实现如下
def digui(i):
   if i >1:
       result= i*digui(i-1)
   else:
       return  i
   return  result
a=digui(5)
print(a)

具体为什么要那样来写呢?

现在我们要求 5!,那 5!=5 * 4!,偷懒的做法就是找一个人来算 4!,然后把值返回给我,我再用 5 * (4!的值) 即可得出结果。

那我们要算 4!,4!=4 *3!,偷懒的做法就是找一个人来算 3!,然后把值返回给我,我再用 4 * (3!的值) 即可得出结果。同理,我们计算 3! 和 2!都可以这样做。现在的问题就是如何得到这个返回值呢?

def xxx(num):
   (num)* xxxx(num-1)

def xx(num):
   (num)* xxx(num-1)

def digui(num):
   num * xx (num-1)

我们要计算num的阶乘 定义一个函数:
def digui(num):
     num * xx(num-1)
那就是用num去乘以(num-1)!,
那为了方便计算我们就直接定义一个函数 : def xx(num),进行求(num-1)!
把(num-1)作为参数传进去,digui(num)函数体即为num * xx (num-1)

  要计算(num-1)!即(num-1) 乘以 (num-1-1)!即可,
  为了方便计算我们就直接定义一个函数 : def xxx (num),把(num-1)作为参数传进去,
xx(num)函数体即为 num * xxx (num-1),然后大家就会发现,其实代码都差不多,就是
不断地构造新函数求(num-1)!再与num相乘
(在这个分析过程中把谁传进函数去,就把谁看成num)

既然这个函数:  def digui(num):
                num * xx(num-1)
是用来计算num的阶乘,num可以为任意数,那么我们把xx 改为 digui,那不就是求(num-1)的阶乘吗?

按照上面的思路有下图解答过程

4bf8809d1648472fce51cefbde79add1.png

递归实现阶乘

def digui(num):
   if num > 1:
       return num * digui(num - 1)
   else:
       return num
a=digui(numm)   #numm代表被求阶乘的数
print(a)

当然,递归是不停的调用函数自身,但是也不能一直调用下去

def digui():
   print('hahahahahahahaha')
   digui()
结果就是打印很多次'hahahahahahahaha',然后就报错,
因为每台电脑的内存都是有限的,进行递归时,
都会开辟一小块内存来存储上一次递归产生的值,当占用达到一定程度时
操作系统就会把程序 '杀了祭天'。

能不能使用递归,就要看问题满不满足以下条件:
1、能不能通过递归来把问题逐渐缩小,且新问题与原问题具有相同的形式。
2、有没有明确的结束条件。
满足以上条件就可以使用递归。

匿名函数:是单一的表达式,不是语句块

定义形式:lambda 参数1,参数2,参数3,...... : 表达式

lambda 只是定义的关键字,类似于 def

:代表分割符把参数和表达式分开

匿名函数会自动返回函数值,不需要return

匿名函数实例:lambda x,y : x>y

在之前排序的讲解中,排序我们对列表进行了排序,直接用sort()方法。但是,如果列表中的元素是字典还能用sort()进行排序吗?如果能进行排序,那要用什么手段呢?。

实例:

list=[{'name':'laowang','age':23},{'name':'xiaoqing','age':32},{'name':'dawang','age':453}]
list.sort(key= lambda x:x['name'])
print(list)
结果:
   [{'name': 'dawang', 'age': 453}, {'name': 'laowang', 'age': 23}, {'name': 'xiaoqing', 'age': 32}]
按照 name对应的值的第一个字母的Ascll 值进行排序。
list=[{'name':'laowang','age':33},{'name':'xiaoqing','age':32},{'name':'dawang','age':453}]
list.sort(key= lambda x:x['age'])
print(list)
结果:
 [{'name': 'xiaoqing', 'age': 32}, {'name': 'laowang', 'age': 33}, {'name': 'dawang', 'age': 453}]
 按照 age大小进行排序。

图解:

6f29736d3619e67f8bb4d19ea20ced05.png

匿名函数和一般函数一样,可以有多个参数,也可以有给参数赋默认值

由于匿名函数只是一个表达式,所以匿名函数也可以直接赋值给变量。
然后用该变量进行这个函数的调用。

c=lambda x,y:x>y
print(c(4,3))
结果为:
     True
a=lambda a,b=2:a+b    #a,b为参数   a+b为表达式
print(a(3))
结果:
   5
#直接后面传递实参
a = (lambda x,y: x if x> y else y)(101,102)
print(a)
结果:
   102
与列表进行使用
L=[lambda x:x**x,lambda x:x*x**x]
for i in L:
    print(i(6))
结果:
       46656
       279936
    
 与字典结合使用
L={'age':(lambda x,y:x if x>y else y)(1,9)}
print(L)
结果:
       {'age': 9}

匿名函数可以实现很多一般函数实现的操作,具体更详细的操作,小伙伴们可以自己去探索哦。

不因每天必发一篇而降低文章质量,质量永远第一

喜欢本文的小伙伴, 欢迎转发本文给身边需要的人

欢迎大家关注公众号---->小邮差

文章内容若有问题,希望大家不吝指出, 可以在公众号与小邮差交流哦

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值