抱歉我的英语不好。 所以,我的合并排序有问题。 这是合并部分:
fusion: nTableau debut: deb1 fin1: fin1 fin2: fin2
| deb2 compt1 compt2 i t |
t := #().
deb2 := fin1 + 1.
compt1 := deb1.
compt2 := deb2.
i:= deb1.
(i to: fin1) do: [ t at:(i-deb1) put: (nTableau at:i) ].
i := deb1.
i to: deb1 do: [
(compt1 = deb2) ifTrue: [ ]
ifFalse: [ compt2 =(fin2 +1)ifTrue: [ nTableau at:i put: (t at: compt1-deb1). compt1 := compt1+1 ] ];
ifFalse: [ (t at: (compt1-deb1) < nTableau at: compt2) ifTrue: [ nTableau at:i put: (t at:(compt1 - deb1)). compt1 := compt1 +1 ] ];
ifFalse: [ nTableau at:i put: (nTableau at:compt2) ]
]
这是我的递归函数:
三
| trier milieu |
trier := nil.
trier := [ :tab :deb :fin |
[ deb := (taille/taille). fin = taille. tab := tableau ].
[ milieu := ( deb + fin ) //
(deb ~= fin) ifTrue: [
trier value: tab value: deb value: milieu.
trier value: tab value: milieu+1 value: fin.
fusion: tab deb: debut fin1: milieu fin2: fin.
]
]
我在排序部分遇到了问题。请帮帮我。
答案 0 :(得分:0)
似乎你误解了#ifTrue:ifFalse:和那个系列的消息。
它们不是语法结构,而是发送给对象并受其影响的消息;作为一个级联。
在您的示例中,您有
i to: deb1 do: [
condition
ifTrue: [ ]
ifFalse: [ condition2 ifTrue: [ actions ] ];
ifFalse: [ condition3 ifTrue: [ other actions ];
ifFalse: [ an action more ]
但是发送到相同的布尔条件的第一个ifTrue:ifFalse :(顺便说一下,它只是放入ifFalse:因为ifTrue:part中的空块)。然后,ifFalse:再次,两次,到同一个对象(因为那就是;意味着)。条件没有被重新评估,所以如果它第一次是真的,什么也没做,如果它是假的,那么将执行三个动作。 它相当于只有一个ifFalse,连接块内的所有动作。 ......我不认为这就是你的意图。
此外,你还有那个
i := deb1.
i to: deb1 do: [ ... ]
并使用相同的值,将deb1作为:deb1。 (这甚至会运行吗?我认为该块需要参数)