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

时间:2015-08-31 16:01:42

标签: python python-3.x

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)。 可能是所有三胞胎都没有产生的问题。

3 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

您的函数只生成一对,因为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))

答案 2 :(得分:0)

正如许多其他人所指出的那样,当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