2016-10-21 12 views
0

このメソッド(SOMベンチマークからの)は、Smalltalkのローカルでない戻り値に依存します。それらなしで同じ結果を生み出す方法はありますか?Smalltalk:非ローカルリターンを避けるのに最適ですか?アルゴリズムの書き換え

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 

注:ループ内で再帰的であると思われるが、あなたの方法の選択が間違っているかもしれ あなたは簡単のように、他の構文を使用してループを書くことができます。

「呼び出し元と呼び出し先について知っている」とはどういう意味なのでしょうか?私はコード上でほとんど文法的な書き換えを行いました。 自己封じ込めと同じです。 このメソッドは自己完結型ではありませんが、8クイーン問題の解決策の一部と思われますが、新しいクイーンの場所の有効性をチェックするために(自己行:r列:c)に依存します。

+0

答えをありがとう。 100%正確ではありませんが(行対rおよび行が増分されません)、それは私が探していたものでした。 –

+0

ああ、はい@JorgeAgra。私たちが書いたものすべてを試してコンパイラとデバッガを利用しているので、私は少し気にせずにコードを書いています...しかし、この場合私は一部を見逃して、あまりにも怠け者でした残りの部分を画像に書き込む –

0

誤解を修正しましょう。図示のコードはではなく、にはローカルでない返品が含まれているため、この機能に頼ることはできません。

示されている返品はすべて通常の返品で、結果は返されます。 非ローカルリターンとは、値が呼び出し元のメソッド以外のどこかに返される場合を指します。

返品を避ける理由はありませんので、

関連する問題