Python lambda函数计算一个数的阶乘

drc*_*coa 7 python lambda python-2.7

我刚开始学习python.我遇到了lambda函数.在其中一个问题上,作者要求为一个数字的阶乘写一个单线性lambda函数.

这是给出的解决方案:

num = 5
print (lambda b: (lambda a, b: a(a, b))(lambda a, b: b*a(a, b-1) if b > 0 else 1,b))(num)
Run Code Online (Sandbox Code Playgroud)

我无法理解奇怪的语法.(a,b)是什么意思?

谁能解释一下?

谢谢

Wal*_*han 6

阶乘本身几乎就像你期望的那样.你推断它a是...阶乘函数.b是实际参数.

<factorial> = lambda a, b: b*a(a, b-1) if b > 0 else 1
Run Code Online (Sandbox Code Playgroud)

这个位是阶乘的应用:

<factorial-application> = (lambda a, b: a(a, b))(<factorial>, b)
Run Code Online (Sandbox Code Playgroud)

a是因子函数本身.它将自己作为第一个参数,将评估点作为第二个参数.recursive_lambda只要你不介意a(a, b - 1),这可以推广到a(b - 1):

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))
Run Code Online (Sandbox Code Playgroud)

所以我们有外部部分:

(lambda b: <factorial-application>)(num)
Run Code Online (Sandbox Code Playgroud)

如您所见,调用者必须通过的是评估点.


如果你真的想要一个递归的lambda,你可以命名lambda:

fact = lambda x: 1 if x == 0 else x * fact(x-1)
Run Code Online (Sandbox Code Playgroud)

如果没有,您可以使用简单的辅助函数.你会注意到这ret是一个可以引用自身的lambda,不像之前的代码那样没有lambda可以引用它自己.

def recursive_lambda(func):
    def ret(*args):
        return func(ret, *args)
    return ret

print(recursive_lambda(lambda factorial, x: x * factorial(x - 1) if x > 1 else 1)(6))  # 720
Run Code Online (Sandbox Code Playgroud)

两种方式你都不必诉诸于将lambda传递给自己的荒谬手段.


Pat*_*shu 6

让我们把这个衬里剥开就像洋葱一样.

print (lambda b: (Y))(num)
Run Code Online (Sandbox Code Playgroud)

我们正在创建一个匿名函数(关键字lambda意味着我们将要键入一系列参数名称,然后是冒号,然后是使用这些参数的函数),然后传递num以满足其一个参数.

   (lambda a, b: a(a, b))(X,b)
Run Code Online (Sandbox Code Playgroud)

在lambda中,我们定义了另一个lambda.调用这个lambda Y.这个有两个参数,a和b.a用a和b调用,所以a是一个可调用的,它自己和另一个参数

            (lambda a, b: b*a(a, b-1) if b > 0 else 1
            ,
            b)
Run Code Online (Sandbox Code Playgroud)

这些是Y的参数.第一个是lambda函数,称之为X.我们可以看到X是阶乘函数,第二个参数将成为它的数字.

也就是说,如果我们上去看Y,我们可以看到我们会打电话:

X(X, b)
Run Code Online (Sandbox Code Playgroud)

哪个会做

b*X(X, b-1) if b > 0 else 1
Run Code Online (Sandbox Code Playgroud)

并称之为自我,形成阶乘的递归部分.

并且一直向外看,我们可以看到b是我们传入最外面的lambda的num.

num*X(X, b-1) if num > 0 else 1
Run Code Online (Sandbox Code Playgroud)

这有点令人困惑,因为它被写成一个令人困惑的一个班轮:)


小智 6

这很简单:

n=input()

print reduce(lambda x,y:x*y,range(1,n+1))
Run Code Online (Sandbox Code Playgroud)