Сортировать слияния в Pharo
Извините за мой плохой английский. Итак, у меня проблема с сортировкой слияний. Это часть слияния:
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.
]
]
У меня проблема с сортировкой. Пожалуйста, помогите мне.
1 ответ
Кажется, вы неправильно поняли, что делает #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:). И после ifFalse: снова, еще два раза, к тому же объекту (потому что это то, что означает;). Условие не переоценивается, поэтому, если в первый раз оно было истинным, ничего не было сделано, и если оно было ложным, будут выполнены три блока действий. Это эквивалентно наличию только одного ifFalse, объединяющего все действия внутри блоков.... и я не думаю, что это то, что вы хотели.
Кроме того, вы имели до этого
i := deb1.
i to: deb1 do: [ ... ]
и там вы используете то же значение, делая deb1 to: deb1. (Это вообще работает? Я думал, что блок требует аргумента)