2016-08-08 2 views
0

파스칼의 삼각형을 2D 배열로 생성하는 메소드를 작성하려고합니다. 예를 들면 다음과 같습니다 루비의 파스칼 삼각형

pascal(3) # => [[1],[1,1],[1,2,1]] 

내 코드입니다 : 내가 행 발전기가 잘 작동 알고

def pascal n 
    pascal = [] 
    row = [1] 
    (1...n).each do |i| 
    #first iteration set pascal equal to [[1]] and row to [1,1] 
    if i.zero? 
     pascal << row 
     #sets new value for row for next iteration 
     row = [1,1] 
    else 
     #row generator sets new value for row 
     row = ([0] + row).zip(row + [0]).collect { |a, b| a + b } 
     #push row's new value into pascal array 
     pascal << row 
    end 
    end 
end 

, 나는 IRB와 자신을 테스트했습니다. 마치 실행되지 않은 것처럼 출력은 1...5입니다.

내 코드에 어떤 문제가 있습니까? 제발, 당신이 볼 수 있듯이, 나는 초보자입니다. 고마워요 :)

답변

0

평가 된 마지막 것은 루비 방법의 반환 값입니다. 귀하의 경우는 each입니다. each은 iterated (범위)를 반환합니다. 명시 적으로 pascal 배열을 메서드에서 반환해야합니다. 결과가 필요한 결과 인 것 같습니다. 이 줄을 메서드 끝에 추가하십시오.

 pascal << row 
    end # end if 
    end # end each 

    pascal # < this line 

end # end method 

이 따라서, 메소드의 반환 값을 pascal 평가 마지막 일을하고 있습니다.

JFYI, 귀하의 코드가 논리를 깨뜨린 것으로 보입니다. 위에서 언급 한 수정 작업을 수행하면이 결과가 나타납니다 (예상과 일치하지 않음).

pascal(3) # => [[1, 1], [1, 2, 1]] 

나는 이것을 디버깅 할 때까지 남겨두고 있습니다. :)

+0

답장을 보내 주셔서 감사합니다. 왜 작동하지 않았는지, 반복에 너무 집중하여 돌아 오는 것을 잊었습니다. 바로 디버깅을 시작합니다! – cerealCode

+1

This, BTW는 마지막 질문에서와 똑같은 버그입니다. 관용적으로,'each' 대신에'map'을 사용할 것입니다. 그렇게했다면, 여러분의 코드는 올바르게 동작 할 것입니다. –

+0

알아두면 좋겠지 만, 각지도와지도의 차이점을 잊어 버리는 경향이 있습니다. 범위를'(1 ... n + 1) '로 변경하여 해결했지만 대신 맵을 사용합니다. – cerealCode