使用此算法生成唯一的毕达哥拉斯三元组


def pyg(n):
    n=int(n)
    for i in range(1,n):
        a=(2*i)+1
        b=(2*i)*(i+1)
        c=(2*i)*(i+1)+1
        return(a,b,c)

当我尝试使用pyg(100)在Shell上运行这个时,我只得到输出(3,4,5)。问题可能是所有的三元组都没有生成

正如许多人指出的那样,当执行return语句时,函数将结束,并且不会继续循环。但是,您可以选择从单个函数返回多个值。例如,聚合列表中的值并返回该值,或者使用yield关键字而不是returnyield关键字将使您的函数成为生成器函数,它返回一个可迭代生成器对象,其中包含所有您期望的元素。

我建议您将代码拆分为单独的函数,因此您将原始公式作为I 的函数,以及将返回1 <= i < n元素的生成器函数。注意,您可以通过将生成器的元素提供给list构造函数来收集列表。

def pyg(i):
  a = (2*i) + 1
  b = (2*i) * (i+1)
  c = (2*i) * (i+1) + 1
  return (a,b,c)
def pygs(n):
  for i in range(1, n):
    yield pyg(i)
print(list(pygs(10))) # prints the first 9 Pythagorean triplet as a list of tuples

return句。更改为yield。如果你想测试它,你可以:

>>> pygs = pyg(100)
>>> next(pygs)
(3, 4, 5)
>>> next(pygs)
.
.
.

你的函数只产生一对,因为return会中断函数的执行。您可以使用yield关键字,如@jgomo3所建议的,或map函数:

def generate_triplet(n):
    a=(2*n)+1
    b=(2*n)*(n+1)
    c=(2*n)*(n+1)+1
    return(a,b,c)
def pyg(n):
    return map(generate_triplet, range(1, int(n))

最新更新