<factorial> = lambda a, b: b*a(a, b-1) if b > 0 else 1
此位是阶乘的应用:
<factorial-application> = (lambda a, b: a(a, b))(<factorial>, b)
a是阶乘函数本身。它以自身为第一个论证,以评价点为第二个论证。只要你不介意a(a, b - 1)而不是a(b - 1),这可以概括为recursive_lambda:
recursive_lambda = (lambda func: lambda *args: func(func, *args))
print(recursive_lambda(lambda self, x: x * self(self, x - 1) if x > 0 else 1)(6))
# Or, using the function verbatim:
print(recursive_lambda(lambda a, b: b*a(a, b-1) if b > 0 else 1)(6))
阶乘本身几乎如你所料。你推断
a
是。。。阶乘函数。b
是实际参数。此位是阶乘的应用:
a
是阶乘函数本身。它以自身为第一个论证,以评价点为第二个论证。只要你不介意a(a, b - 1)
而不是a(b - 1)
,这可以概括为recursive_lambda
:所以我们有外部部分:
如您所见,调用者必须通过的只是评估点。
如果您实际上想要一个递归lambda,您可以name the lambda:
如果没有,您可以使用a simple helper function。您会注意到
ret
是一个可以引用自身的lambda,这与前面的代码中没有lambda可以引用自身不同。这两种方式你都不必用荒谬的方式把兰姆达传递给自己。
让我们把这一层像洋葱一样剥开。
我们正在创建一个匿名函数(关键字lambda表示我们将要键入一系列参数名,然后是冒号,然后是使用这些参数的函数),然后将num传递给它以满足其一个参数。
在lambda的内部,我们定义了另一个lambda。调用这个lambda Y。这个参数有两个参数,a和b。a是用a和b调用的,所以a是一个可调用的,它接受自己和另一个参数
这些是Y的参数,第一个是lambda函数,称之为X,我们可以看到X是阶乘函数,第二个参数将成为它的数字。
也就是说,如果我们上去看看Y,我们会打电话给:
那就行了
调用自身,形成阶乘的递归部分。
再往外看,我们可以看到b是我们传给最外层lambda的num。
这有点让人困惑,因为它是作为一个令人困惑的一行写的:)
很简单:
相关问题 更多 >
编程相关推荐