这个方法(来自SOM基准)依赖于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
!
注意(另一个相关问题):是否可以在不了解调用者和被调用者的情况下更改此代码我想它应该能让你更好地理解我的目的,但是对于我的问题,这种方法难道不应该是独立的吗?
最佳答案
是的,这是可能的。
您使用的是非本地返回,只从1到8:
您可以使用其他语法轻松编写循环,例如:
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
请注意,对placequeen:in循环的调用似乎是递归的,可能是方法的选择器错误。
我不明白你说的“了解来电者和被叫者”是什么意思我对代码做了一个主要的语法重写。
自我封闭也是如此。
这种方法并不是独立的,它似乎是8皇后问题解决方案的一部分,但是依赖于(self row:r column:c)来检查新皇后所在位置的有效性。