Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 帕斯卡三角形类型问题-通过在下层添加每对相邻的数字来查找顶层的数字_Python_List_Tuples - Fatal编程技术网

Python 帕斯卡三角形类型问题-通过在下层添加每对相邻的数字来查找顶层的数字

Python 帕斯卡三角形类型问题-通过在下层添加每对相邻的数字来查找顶层的数字,python,list,tuples,Python,List,Tuples,我甚至不知道如何开始:(我应该创建一个函数。问题如下: 大小为n的金字塔由n个数字组成, 以列表形式给出 下一层包含(n-1)个数字,下一层包含(n-2) 数字等。每一个数字是通过将每一对数字相加得到的 下层的相邻编号和过程重复,直到顶部 图层有1个数字 问题:创建一个函数,该函数在 返回底层,返回顶层 例如 测试用例: pyramid([1, 2]) 3 pyramid([3, 2, 1]) 8 pyramid([2, 0, 2, 1]) 9 任何帮助都将不胜感激!您可以通过构建三

我甚至不知道如何开始:(我应该创建一个函数。问题如下:

大小为n的金字塔由n个数字组成, 以列表形式给出

下一层包含(n-1)个数字,下一层包含(n-2) 数字等。每一个数字是通过将每一对数字相加得到的 下层的相邻编号和过程重复,直到顶部 图层有1个数字

问题:创建一个函数,该函数在 返回底层,返回顶层

例如

测试用例:

pyramid([1, 2])

3

pyramid([3, 2, 1])

8

pyramid([2, 0, 2, 1])

9

任何帮助都将不胜感激!

您可以通过构建三角形中的每一行来实现。首先编写一个函数,将您从一行带到上一行

def下一行(行):
返回[行[i]+行[i+1]表示范围内的i(列(行)-1)
现在,如果给您一行,您可以检查行中是否只有一个元素并返回该元素,或者如果有多个元素,您可以找到下一行并返回该行的金字塔值

def金字塔(行):
如果len(行)==1:
返回行[0]
其他:
返回金字塔(下一行(行))
或者,您可以先做一些数学运算,然后确定起始行中的每个数字将被添加多少次以形成最后一行。这不是一个简单的计算。但如果您将其绘制出来,您可能会看到它。该行第n个位置的元素将被求和为最终答案的次数是r的第n个位置的值pascal三角形与输入行元素数的关系

也就是说,您应该将输入行与相同长度的pascal三角形行进行点积。您可以直接构造pascal三角形的正确行。从python 3.8开始,您可以从math import comb
如果您没有python 3.8,我将在这里实现它

从数学导入阶乘
def梳(n,r):
返回阶乘(n)/(阶乘(r)*阶乘(n-r))
然后可以计算pascal三角形的第n行:

def pascal_行(n):
返回[范围(0,n)中i的梳(n-1,i)]
现在我们可以直接从一行开始计算金字塔

def dot_产品(a、b):
压缩=压缩(a,b)
返回和(z[0]*z[1]用于压缩的z)
def金字塔(世界其他地区):
返回点积(行,帕斯卡(列)(行)))

您可以检查金字塔的两个版本是否给出了相同的结果。

我不想给您实际的代码:),但因为我已经解决了它,所以它就在这里。使用递归解决了它-

def pyramid(thislist):
    if(len(thislist) == 1):
        print(thislist[0])
        return
    newlist = []
    
    for i in range(len(thislist)-1):
        newlist.append(thislist[i] + thislist[i+1])
        
    pyramid(newlist)
    
if __name__ == "__main__":
    mylist = [3, 2, 1]
    pyramid(mylist)
    

递归是最简单的方法:

def pyramid(A):
    return A[0] if len(A)==1 else pyramid([a+b for a,b in zip(A,A[1:])])

pyramid([1,2,3]) # 8
但您也可以迭代地进行

def pyramid(A):
    while len(A)>1:
        A = [a+b for a,b in zip(A,A[1:])]
    return A[0]

诀窍是使用zip()获得要相加的一对数字(每个数字与列表中的下一个数字)

我想你知道如何处理第一种情况,对吗?考虑一下如何处理第二种情况并返回一个与第一种情况类似的数组,然后使用你所知道的解决第一种情况的方法。现在概括一下……你可以将第三种情况转化为第二种情况来解决。StackOverflow不是为家庭作业提供代码的,所以解决方案,所以你尝试一下,展示你的尝试,即使是第一个简单的案例。这样,你将从这个社区得到最大的帮助
def pyramid(A):
    while len(A)>1:
        A = [a+b for a,b in zip(A,A[1:])]
    return A[0]