有什么方法可以改进python代码来计算pascal三角形中的偶数吗?

2024-06-07 17:05:36 发布

您现在位置:Python中文网/ 问答频道 /正文

这是我写的一段代码,用来计算pascal三角形的前1023行中有多少个偶数。不过,我觉得它可能需要改进,特别是下一行的功能。你知道吗

def next_row(r):
    i = 0
    s = []
    while i < len(r) -1:
        s.append(r[i] + r[i+1])
        i += 1
    s.insert(0, 1)
    s.append(1)
    return s

def count_even(r):
    counter = 0
    for item in r:
        if item % 2 == 0:
            counter += 1
    return counter

def results(i, t, e):
    print('In the first ' + str(i) + ' lines of the pascal triangle, there are ' + str(t) + ' entries. ' + 
        str(e) + ' of them are even.')

r = [1]
even = 0
total = 0
for i in range (0, 1023):
    even += count_even(r)
    total += len(r)
    r = next_row(r)
    results(i+1, total, even)

Tags: inforlenreturndefcountcounteritem
3条回答

如果你的代码没问题,我建议你用

for i in range(len(r) -1):
    s.append(r[i] + r[i+1])

而不是

while i < len(r) -1:
    s.append(r[i] + r[i+1])
    i += 1

PS公司 如果你用

for i in range(len(r) -1):
    s.append(r[i] ^ r[i+1])

您将看到结果不会改变,正如@johncoleman所建议的,它是有效的。但是如果你把它打印出来,帕斯卡三角形会退化成0和1的集合。你知道吗

在这种情况下,您甚至可以简化计数:

def count_even(r):
    return len(r)-sum(r)

对于初学者,在读取数组内容时,应该避免while循环和索引迭代。观看loop like a native对话以获得更多见解。在您的例子中,由于您对一次对连续值进行交互感兴趣,您可以查看^{} recipe。你知道吗

其次,不必在所有中心元素的计算之后修补行,您可以提供一个更大的行来开始计算,方法是在两边加0。为了避免调整列表的大小,可以使用^{}。你知道吗

最后,要获得1023行的第一行,您可能需要提供一个生成器,该生成器提供来自pascal三角形的无尽行流,并使用^{}将该生成器缩短到1023行之后。你知道吗

修订代码:

import itertools


def pairwise(iterable):
    a, b = itertools.tee(iterable)
    next(b, None)
    return zip(a, b)


def next_row(row):
    larger_row = itertools.chain([0], row, [0])
    return [a + b for a, b in pairwise(larger_row)]


def pascal_triangle():
    row = [1]
    while True:
        yield row
        row = next_row(row)


def count_even(iterable):
    return sum(item % 2 == 0 for item in iterable)


def main(limit):
    even = total = 0
    for index, row in enumerate(itertools.islice(pascal_triangle(), limit), 1):
        even += count_even(row)
        total += len(row)
        print('In the first', index, 'lines of the pascal triangle, '
              'there are', total, 'entries.', even, 'of them are even.')


if __name__ == '__main__':
    main(limit=1023)

只是使用列表理解使您的代码(前两个函数)稍微不那么冗长。通过这样做,您可以避免初始化i=0和空列表s=[]以及while循环来跟踪i。在count_even函数中,如果r是一个数组(在代码中它是一个列表),还可以使用以下counter = len(r[r%2==0])。你知道吗

def next_row(r):
    s = [r[i] + r[i+1] for i in range(len(r)-1)]
    s.insert(0, 1)
    s.append(1)
    return s

def count_even(r):
    counter =  len([i for i in r if i%2 == 0])
#   counter = len(r[r%2==0]) #  If 'r' is an array
    return counter

其余的我保持不变。你知道吗

相关问题 更多 >

    热门问题