cs61a fall 2020 HW02 Q5:Anonymous factorial个人解答

文章讲述了作者如何使用lambda函数解决一个递归问题,通过将函数作为参数传递,经过多次尝试和修改,最终成功实现了作业要求的函数形式,并分享了这一过程。
摘要由CSDN通过智能技术生成

首先把题目放出来:

我摸了半天脑袋也没想出来怎么做,无奈就网上搜了下,于是知道可以把函数自己作为参数传进去,但之后的讲解好像不同人有不同的思路,我又有点看不懂,最后还是选择自己来。

从最开始的情形出发:

f = lambda n: 1 if n == 1 else n*f(n-1)

因为不能用赋值语句,那我们就用把函数作为参数传进去的方法,不就是给这个匿名函数加个参数f嘛,这样的话就是:

(lambda f,n: 1 if n == 1 else n*f(n-1))(f)

很显然lambda f的f是形参,而最后那个传进去的f又得是个具体的函数,所以这样肯定会报错'f' is not defined。那f到底是什么呢,f不就是这个函数自身嘛,那我们把最后那个传入参数(f)去掉,剩下就是函数,把它复制粘贴替换掉那个具体的f,这样的话就是:

(lambda f,n: 1 if n == 1 else n*f(n-1))(lambda f,n: 1 if n == 1 else n*f(n-1))

哎!等一下,换是换了,但这个函数自身得要两个参数f和n啊,那个f(n-1)得改成f(f,n-1)。要注意在这里f(f,n-1)是在冒号后面的,也就是说f已经因为冒号前面f的传入而实例化了,所以这里f我们不用再复制粘贴了,那么这样的话就是

(lambda f,n: 1 if n == 1 else n*f(f,n-1))(lambda f,n: 1 if n == 1 else n*f(f,n-1),n)

到这里说实话我心里也没底了,所以我们打开python试一下

成功了!

接下来回到作业,本质性的东西我们已经没问题了,但作业还讲究一个格式。因为按照作业要求应该是f(f)(n),其中f(f)是作业想要我们return出去的,而我们写出来的是f(f,n),所以我们再把格式修改一下,把lambda f,n改成 lambda f: lambda n ,然后把最后传入的n去掉就行:

(lambda f: lambda n: 1 if n ==1 else n*f(f,n-1))(lambda f,n: 1 if n ==1 else n*f(f,n-1))

 接下来我们就只需要复制这一大串,然后加个(n)就行了,还是打开python试一下:

其实这里还可以简化一下,简化成

(lambda f: lambda n: f(f,n))(lambda f,n: 1 if n ==1 else n*f(f,n-1))

最后交下作业:

至此就算是完成了。感觉我这个过程可能挺繁琐的,就是自己一点一点试,所幸最后还是试出来,所以把自己尝试的过程分享一下,还求不喜勿喷,欢迎批评指正!

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值