APL / APLX:在for循环中使用if语句时出现值错误

时间:2016-10-16 09:44:09

标签: apl

我试图在APLX中实现快速排序,但我似乎无法解决此问题错误,我不断从语句:If((ITEM COMPARE PIVOT)≤0)获取。经过一些测试后,我认为问题在于我在For循环中使用了If语句,但我不知道为什么会出现问题。这里是整个函数(或者更确切地说是运算符),以防问题出在其他地方:

(注意比COMPARE是我传递给quicksort的比较器功能)

(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 个答案:

答案 0 :(得分:2)

嗯,我担心我对APLX并不熟悉,但这是我的0.02美元,无论如何:

  1. 你知道⍋?所以我认为这是一个教育练习......; - )
  2. 控制结构没有问题,但是你的COMPARE -fn没有返回结果,所以当你尝试使用结果(通过引用COMPARE)时,错误。函数头应该是∇ RESULT←(COMPARE QSORT)ARRAY会话输出不被视为“功能结果” - 这需要明确分配!
  3. 另请注意,本地化变量名称被视为良好做法。