首先把题目放出来:
我摸了半天脑袋也没想出来怎么做,无奈就网上搜了下,于是知道可以把函数自己作为参数传进去,但之后的讲解好像不同人有不同的思路,我又有点看不懂,最后还是选择自己来。
从最开始的情形出发:
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))
最后交下作业:
至此就算是完成了。感觉我这个过程可能挺繁琐的,就是自己一点一点试,所幸最后还是试出来,所以把自己尝试的过程分享一下,还求不喜勿喷,欢迎批评指正!