APL / APLX: ошибка значения при использовании оператора if внутри цикла for
Я пытаюсь реализовать быструю сортировку в APLX, но не могу исправить эту ошибку значения, которую я продолжаю получать из оператора :If((ITEM COMPARE PIVOT)≤0)
, После некоторого тестирования я полагаю, что проблема заключается в том, что я использую оператор If внутри цикла For, но я не знаю, почему это будет проблемой. Вот вся функция (или, скорее, оператор), на тот случай, если проблема лежит в другом месте:
(обратите внимание, что COMPARE - это функция сравнения, которую я передаю быстрой сортировке)
(COMPARE QSORT)ARRAY
⍝ If the array has a size of 1
⍝ or less, return
:If (⍴ARRAY) ≤ 1
ARRAY
:endif
⍝ set pivot to last element in array
PIVOTINDEX ← ⍴ARRAY
PIVOT ← PIVOTINDEX⌷ARRAY
⍝ remove pivot from array by assigning
⍝ array to all elements up to pivot index
ARRAY ← (PIVOTINDEX-1)↑ARRAY
⍝ Make empty vectors for values greater
⍝ than and less than the pivot
LESSER ← ⍳0
GREATER ← ⍳0
⍝ loop over ARRAY, place items in GREATER
⍝ or LESSER where appropriate
:For ITEM :In ARRAY
:If((ITEM COMPARE PIVOT)≤0)
LESSER ← LESSER,ITEM
:Else
GREATER ← GREATER,ITEM
:EndIf
:EndFor
SORTED ← SORTED,(COMPARE QSORT LESSER)
SORTED ← SORTED,PIVOT
SORTED ← SORTED,(COMPARE QSORT GREATER)
SORTED
1 ответ
Решение
Хм, боюсь, я не знаком с APLX, но вот мои 0.02$ независимо от:
- Вы знаете о ⍋? Так что я предполагаю, что это образовательный тренинг...;-)
- Нет проблем с управляющими структурами, но ваш
COMPARE
-fn не возвращает результат, поэтому, когда вы затем попытаетесь использовать результат (ссылаясь наCOMPARE
), что создает ошибку. Заголовок функции, вероятно, должен быть∇ RESULT←(COMPARE QSORT)ARRAY
(вывод сеанса не считается "функцией-результатом" - это требует явного назначения!) - Также обратите внимание, что локализация имен переменных считается хорошей практикой.