当前位置: 首页 > 面试题库 >

Pascal的Python三角形

严元白
2023-03-14
问题内容

作为Python的学习经验,我正在尝试编写自己的Pascal三角形版本。我花了几个小时(因为我刚刚开始),但是我得到了以下代码:

pascals_triangle = []

def blank_list_gen(x):
    while len(pascals_triangle) < x:
        pascals_triangle.append([0])

def pascals_tri_gen(rows):
    blank_list_gen(rows)
    for element in range(rows):
        count = 1
        while count < rows - element:
            pascals_triangle[count + element].append(0)
            count += 1
    for row in pascals_triangle:
        row.insert(0, 1)
        row.append(1)
    pascals_triangle.insert(0, [1, 1])
    pascals_triangle.insert(0, [1])

pascals_tri_gen(6)

for row in pascals_triangle:
    print(row)

哪个返回

[1]
[1, 1]
[1, 0, 1]
[1, 0, 0, 1]
[1, 0, 0, 0, 1]
[1, 0, 0, 0, 0, 1]
[1, 0, 0, 0, 0, 0, 1]
[1, 0, 0, 0, 0, 0, 0, 1]

但是,我不知道从这里去哪里。几个小时我一直在撞墙。我想强调,我不希望你为我做这件事;朝正确的方向推动我。作为清单,我的代码返回

[[1], [1, 1], [1, 0, 1], [1, 0, 0, 1], [1, 0, 0, 0, 1], [1, 0, 0, 0, 0, 1], [1, 0, 0, 0, 0, 0, 1], [1, 0, 0, 0, 0, 0, 0, 1]]

谢谢。

编辑:我采取了一些好的建议,并且我完全重写了我的代码,但是现在我遇到了另一个问题。这是我的代码。

import math

pascals_tri_formula = []

def combination(n, r):
    return int((math.factorial(n)) / ((math.factorial(r)) * math.factorial(n - r)))

def for_test(x, y):
    for y in range(x):
        return combination(x, y)

def pascals_triangle(rows):
    count = 0
    while count <= rows:
        for element in range(count + 1):
            [pascals_tri_formula.append(combination(count, element))]
        count += 1

pascals_triangle(3)

print(pascals_tri_formula)

但是,我发现输出有点不可取:

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

我怎样才能解决这个问题?


问题答案:

确定代码查看:

import math

# pascals_tri_formula = [] # don't collect in a global variable.

def combination(n, r): # correct calculation of combinations, n choose k
    return int((math.factorial(n)) / ((math.factorial(r)) * math.factorial(n - r)))

def for_test(x, y): # don't see where this is being used...
    for y in range(x):
        return combination(x, y)

def pascals_triangle(rows):
    result = [] # need something to collect our results in
    # count = 0 # avoidable! better to use a for loop, 
    # while count <= rows: # can avoid initializing and incrementing 
    for count in range(rows): # start at 0, up to but not including rows number.
        # this is really where you went wrong:
        row = [] # need a row element to collect the row in
        for element in range(count + 1): 
            # putting this in a list doesn't do anything.
            # [pascals_tri_formula.append(combination(count, element))]
            row.append(combination(count, element))
        result.append(row)
        # count += 1 # avoidable
    return result

# now we can print a result:
for row in pascals_triangle(3):
    print(row)

印刷品:

[1]
[1, 1]
[1, 2, 1]

帕斯卡三角形的解释:

这是“
n选择k”
的公式(即,从n项的有序列表中有多少种不同的方式(不考虑顺序),我们可以选择k项):

from math import factorial

def combination(n, k): 
    """n choose k, returns int"""
    return int((factorial(n)) / ((factorial(k)) * factorial(n - k)))

一个评论者问这是否与itertools.combinations有关-确实如此。“ n select k”可以通过组合中元素列表的长度来计算:

from itertools import combinations

def pascals_triangle_cell(n, k):
    """n choose k, returns int"""
    result = len(list(combinations(range(n), k)))
    # our result is equal to that returned by the other combination calculation:
    assert result == combination(n, k)
    return result

让我们看看这个演示:

from pprint import pprint

ptc = pascals_triangle_cell

>>> pprint([[ptc(0, 0),], 
            [ptc(1, 0), ptc(1, 1)], 
            [ptc(2, 0), ptc(2, 1), ptc(2, 2)],
            [ptc(3, 0), ptc(3, 1), ptc(3, 2), ptc(3, 3)],
            [ptc(4, 0), ptc(4, 1), ptc(4, 2), ptc(4, 3), ptc(4, 4)]],
           width = 20)
[[1],
 [1, 1],
 [1, 2, 1],
 [1, 3, 3, 1],
 [1, 4, 6, 4, 1]]

我们可以避免使用嵌套列表理解来重复自己:

def pascals_triangle(rows):
    return [[ptc(row, k) for k in range(row + 1)] for row in range(rows)]

>>> pprint(pascals_triangle(15))
[[1],
 [1, 1],
 [1, 2, 1],
 [1, 3, 3, 1],
 [1, 4, 6, 4, 1],
 [1, 5, 10, 10, 5, 1],
 [1, 6, 15, 20, 15, 6, 1],
 [1, 7, 21, 35, 35, 21, 7, 1],
 [1, 8, 28, 56, 70, 56, 28, 8, 1],
 [1, 9, 36, 84, 126, 126, 84, 36, 9, 1],
 [1, 10, 45, 120, 210, 252, 210, 120, 45, 10, 1],
 [1, 11, 55, 165, 330, 462, 462, 330, 165, 55, 11, 1],
 [1, 12, 66, 220, 495, 792, 924, 792, 495, 220, 66, 12, 1],
 [1, 13, 78, 286, 715, 1287, 1716, 1716, 1287, 715, 286, 78, 13, 1],
 [1, 14, 91, 364, 1001, 2002, 3003, 3432, 3003, 2002, 1001, 364, 91, 14, 1]]

递归定义:

我们可以使用三角形所示的关系来递归定义(效率较低,但数学上可能更优雅的定义):

 def choose(n, k): # note no dependencies on any of the prior code
     if k in (0, n):
         return 1
     return choose(n-1, k-1) + choose(n-1, k)

有趣的是,您可以看到每一行的执行时间逐渐变长,因为每一行必须重新计算上一行中的几乎每个元素两次:

for row in range(40):
    for k in range(row + 1):
        # flush is a Python 3 only argument, you can leave it out,
        # but it lets us see each element print as it finishes calculating
        print(choose(row, k), end=' ', flush=True) 
    print()


1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1
1 7 21 35 35 21 7 1
1 8 28 56 70 56 28 8 1
1 9 36 84 126 126 84 36 9 1
1 10 45 120 210 252 210 120 45 10 1
1 11 55 165 330 462 462 330 165 55 11 1
1 12 66 220 495 792 924 792 495 220 66 12 1
1 13 78 286 715 1287 1716 1716 1287 715 286 78 13 1
1 14 91 364 1001 2002 3003 3432 3003 2002 1001 364 91 14 1
1 15 105 455 1365 3003 5005 6435 6435 5005 3003 1365 455 105 15 1
1 16 120 560 1820 4368 8008 11440 12870 11440 8008 4368 1820 560 120 16 1
1 17 136 680 2380 6188 12376 19448 24310 24310 19448 12376 6188 2380 680 136 17 1
1 18 153 816 3060 8568 18564 31824 43758 48620 43758 31824 18564 8568 3060 816 ...

厌倦了Ctrl-C退出时,它会变得非常慢非常快…



 类似资料:
  • Pascal的三角形是工程专业学生的经典示例之一。 它有很多解释。 其中一个着名的是它用于二项式方程。 三角形外的所有值都被视为零(0)。 第一行是0 1 0而只有1获得pascal三角形中的空格,0是不可见的。 通过添加(0 + 1)和(1 + 0)来获取第二行。 输出夹在两个零之间。 该过程持续到达到所需水平。 Pascal的三角形可以使用二项式定理导出。 我们可以使用组合和阶乘来实现这一目标

  • 问题内容: 我有一个小任务,我必须使用2d数组来产生Pascal的三角形。这是我的代码,它可以工作。如果我像这样显示三角形,就有一个额外的信用机会: 但是,我的空格不是这样格式化的。它只是简单地显示所有排列在左侧的数字。它很难描述,但是如果您运行它,您将明白我的意思。 这是我的代码: 如果有人可以帮助我找出如何在程序中添加正确的间距以产生图片中所需的输出,那将是很好的:)我知道我需要将系统打印出来

  • 当我从这些三角形中执行α形状时,我无法得到点集的边界。所以我认为我应该使用约束Delaunay三角测量。我选择三角形库来执行此操作。但麻烦的是,我不知道给函数triangle.triangulate(tri, opts=")提供什么。我把我所有的点集输入字典,但它返回我的点集。所以任何人都可以帮助我使用这个功能或另一种选择来执行轮廓检测?谢啦

  • Python3 实例 以下实例为通过用户输入三角形三边长度,并计算三角形的面积: 实例(Python 3.0+)# -*- coding: UTF-8 -*- # Filename : test.py # author by : www.runoob.com a = float(input('输入三角形第一边长: ')) b = float(input('输入三角形第二边长: ')) c = fl

  • 本文向大家介绍python 打印直角三角形,等边三角形,菱形,正方形的代码,包括了python 打印直角三角形,等边三角形,菱形,正方形的代码的使用技巧和注意事项,需要的朋友参考一下 三角形 等腰直角三角形1 2.7 python:打印直角三角形 coding=utf-8 方式一 方式二 #打印实心等边三角形 #打印菱形 #实心正方形 #空心正方形 知识点说明: python ,end=''备注

  • 本文向大家介绍Python中最大的周长三角形,包括了Python中最大的周长三角形的使用技巧和注意事项,需要的朋友参考一下 假设我们有一个正长度的数组A,我们必须找到面积为非零的三角形的最大周长,该三角形由这些长度中的3个组成。当不可能形成任何非零区域的三角形时,则返回0。 因此,如果输入类似于[3,6,2,3],则输出将为8。 为了解决这个问题,我们将遵循以下步骤- 排序列表A a:=从A删除最