Сортировать слияния в 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. (Это вообще работает? Я думал, что блок требует аргумента)

Другие вопросы по тегам