使用没有变量或递归的 lambda 的 pascal tringle

问题描述

嗨,我有一项任务是使用 lambda 来打印 pascal tringle。我遇到的问题是我不能使用任何变量,也不能使用递归 lambda。我需要通过以下方式提交我的答案:

lambda x : <code>

因为答案是以这种方式提交的,所以我不能使用任何变量,也不能使用递归。

并且颤音需要看起来像这样:

3: [[1],[1,1],2,1]]

所以因为我不能使用任何变量,所以我搜索了一种在没有其他行的情况下打印三角形的方法

并且我发现您可以通过以下方式计算帕斯卡颤音:

1: 0nCr0
2: 1nCr0,1nCr1
3: 2nCr0,2nCr1,2nCr2

所以我尝试用它来解决我的任务,我得到了这个东西:

lambda x : (   [([(int)( ( __import__("math").factorial(i) ) / (__import__("math").factorial(j) * ( __import__("math").factorial(i - j) ) ) ) for j in range(i + 1)]) for i in range(x)]   )

唯一的问题是我不能使用 import 并且我不知道如何在不使用数学库的情况下在 lambda 中使用阶乘。

解决方法

如果没有 Y 组合器,我不知道如何做到这一点。

您将不得不执行以下操作:

def F(n):
    return [1] if n == 0 else [a + b for a,b in zip([0] + F(n - 1),F(n - 1) + [0])]

然后使用 Y combinator 将递归函数转化为 lambda。 F(n) 通过使用每个元素是它上面的两个元素的和这一事实返回三角形的第 n 行。


如果您对调用 F(n-1) 两次不满意,那么

def F(n):
    return [1] if n == 0 else \
        (lambda v: [a + b for a,b in zip([0] + v,v + [0])])(F(n - 1))

利用您可以使用 lambda 来创建临时变量的事实。您仍然需要使用 Y 组合子来消除该函数。

,

您可以手动构建阶乘函数,然后将其与 lambda 一起使用:

定义阶乘(n): 如果(n==0 或 n==1): 返回 1 别的: 返回 n*factorial(n-1)

,

由于您的部分解决方案使用 ij,我不知道您所说的“不能使用任何变量”是什么意思,除非您指的是 全局 变量,在这种情况下,我提交:

pascal = lambda n: [(lambda s: [s] + [s := s * (r - t) // (t + 1) for t in range(r)])(1) for r in range(n)]

print(pascal(6))

输出

> python3 test.py
[[1],[1,1],2,3,4,6,5,10,1]]
>