2016-10-21 2 views
0

이 방법 (SOM 벤치 마크에서 가져옴)은 스몰 토크 지역 반품에 의존합니다. 그들없이 동일한 결과를 산출 할 수있는 방법이 있습니까?스몰 토크 : 비 지역 수익을 방지하는 것이 가장 좋습니까? 알고리즘 다시 쓰기

placeQueenNonLocalReturn: c 
    1 to: 8 do: [ :r | 
     (self row: r column: c) 
      ifTrue: [ 
       queenRows at: r put: c. 
       self row: r column: c put: false. 
       (c = 8) ifTrue: [ ^true ]. 
       (self placeQueen: c + 1) ifTrue: [ ^true ]. 
       self row: r column: c put: true ] ]. 
    ^false 
! 

참고 (다른 질문이지만 관련이 있습니다.) 발신자와 수신자에 대해 알지 못하는 사이에이 코드를 변경할 수 있습니까? 나는 그것이 목적에 대한 더 나은 이해를 주어야한다고 생각하지만, 나의 질문과 관련하여 방법 자체가 포함되어서는 안된다.

+0

"방법이 자체 포함되어 있지 않아야합니까?" 중요한 부분은 인터페이스 (코드에서 분명히 드러나 듯)가 받아 들여지는 인터페이스와 '틀린'대 '진실'의 의미를 기술하는 것입니다. 이는 특히 명확하지 않습니다. –

답변

2

예, 가능합니다. 1 : 8 do : 루프에서 빠져 나오기 위해서만 로컬이 아닌 리턴을 사용하고 있습니다. 쉽게 같은 다른 구문으로 루프를 작성 할 수 있습니다 placeQueen에 대한 호출 것을

exit := false. 
row := 1. 
[row < 9 andNot: [exit]] whileTrue: [ (self row: r column: c) 
      ifTrue: [ 
       queenRows at: r put: c. 
       self row: r column: c put: false. 
       c = 8 ifTrue: [ exit := true ] 
         ifFalse: [ (self placeQueen: c + 1) 
            ifTrue: [ exit := true ] 
            ifFalse: [self row: r column: c put: true ] ] ]. 
^exit 

참고 : 루프에서 재귀 것으로 보인다, 당신의 방법의 선택이 될 수 있습니다 잘못된 것입니다.

나는 "발신자와 피 호출자에 대해 아는 것"이 ​​무엇을 의미하는지 모르겠다 ... 나는 코드에서 대부분 문법적으로 다시 작성했다. 자체 봉쇄와 동일합니다. 이 방법은 독립적 인 것이 아니며, 여왕 문제 해결 방안의 일부인 것처럼 보이지만 (자기 행 : 열 : c) 새 여왕을위한 장소의 유효성을 확인합니다.

+0

답해 주셔서 감사합니다. 100 % 정확하지는 않지만 (행 vs r 및 행은 증가하지 않음), 내가 찾고있는 것이 었습니다. –

+0

아, 예 @JorgeAgra. 나는 우리가 작성한 모든 것을 시험해보고 컴파일러와 디버거를 이용하기 때문에 코드를 작성할 때 약간 부주의하다. 그러나이 경우 나는 일부를 놓쳤고 너무 게으른 편이었다. 이미지에 나머지를 쓰려면 –

0

오해를 바로 잡자. 표시된 코드 이 아니기 때문에이 기능을 사용할 수 없습니다.

표시된 반환 값은 모두 정상 반환 값이며 결과를 호출자에게 반환합니다. 로컬이 아닌 반환 값은 호출하는 메서드가 아닌 다른 곳으로 값이 반환되는 경우를 나타냅니다.

따라서 반환 값이 표시되지 않도록 할 이유가 없습니다.