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$ независимо от:

  1. Вы знаете о ⍋? Так что я предполагаю, что это образовательный тренинг...;-)
  2. Нет проблем с управляющими структурами, но ваш COMPARE -fn не возвращает результат, поэтому, когда вы затем попытаетесь использовать результат (ссылаясь на COMPARE), что создает ошибку. Заголовок функции, вероятно, должен быть ∇ RESULT←(COMPARE QSORT)ARRAY (вывод сеанса не считается "функцией-результатом" - это требует явного назначения!)
  3. Также обратите внимание, что локализация имен переменных считается хорошей практикой.
Другие вопросы по тегам