2014-05-24 5 views
2

베르누이의 삼각형에 대한 생성기를 만들고 싶다면 삼각형의 j 행의 숫자 ij 파스칼 삼각형의 첫 번째 i 숫자의 부분 합계입니다.제네레이터 함수가 항상 같은 값을 반환하는 이유는 무엇입니까?

삼각형은 다음과 같이 보일 것이다 : 목록에서 파이썬으로 표현 될 것이다

enter image description here

:

[[1], [1,2], [1,3,4], [1,4,7,8] 

내 생성 기능이 올바른지 최초의 출력으로 [1]를 반환 하지만 항상 []을 반환합니다!

내 코드의 그 :

def next_row(row): 
    n = len(row) 
    new_row = [row[0]] + [row[i] + row[i+1] for i in range(n - 1)] + [row[-1]] 
    return new_row 


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


def generate_bernoulli(): 

    row=next(generate_pascal()) 
    n=len(row) 
    while True: 
     yield row 
     row=[row[0]+sum(row[0:i]) for i in range(n-1)] 
+0

항상 정확하게 무엇을 의미합니까? – thefourtheye

+4

'generate_bernoulli'에서'n'을 절대 업데이트하지 않습니다. – roippi

+0

'generate_pascal'도 한 번만 호출합니다. 무엇을 성취하려고합니까? – jonrsharpe

답변

4

첫째, 당신 만이 아니라 모든 반복을 호출하는 대신, 한 번 next을했다. 둘째, 각 반복에서 행을 업데이트하지 않았습니다. 또한 부분 합계와 yield이 교체되었습니다. 나는 while 루프 안에 next을 호출하고 그것들 외부에 pascal 생성기를 초기화함으로써 이것들을 고쳤다. 마지막으로, 당신의 합계는 조금 벗어났습니다; 나는 이것을 고쳤다. 올바른 코드는 다음과 같습니다.

def generate_bernoulli(): 
    pascal = generate_pascal() 
    while True: 
     row=next(pascal) 
     n=len(row) 
     row=[sum(row[0:i+1]) for i in range(n)] 
     yield row 
1

파스칼의 삼각형 행의 부분 합계를 계산해야합니다. 코드를 작성하는 방법은 다음과 같습니다.

def partial_sums(xs): 
    s = 0 
    for x in xs: 
     s += x 
     yield s 

def generate_bernoulli(): 
    for row in generate_pascal(): 
     yield list(partial_sums(row)) 
관련 문제