APL / APLX:在 for 循环中使用 if 语句时出现值错误
APL / APLX: value error when using an if statement inside a for loop
我正在尝试在 APLX 中实现快速排序,但我似乎无法修复这个值错误,我一直从语句 :If((ITEM COMPARE PIVOT)≤0)
中得到这个错误。经过一些测试,我认为问题在于我在 For 循环中使用了 If 语句,但我不知道为什么会出现问题。这是整个函数(或更确切地说是运算符),以防万一问题出在其他地方:
(注意 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
嗯,恐怕我对 APLX 不熟悉,但无论如何,这是我的 0.02 美元:
- 你知道⍋吗?所以我认为这是一个教育练习......;-)
- 控制结构没有问题,但是你的
COMPARE
-fn 没有 return 结果,所以当你尝试使用结果时(参考 COMPARE
),这会产生错误。函数头可能应该是 ∇ RESULT←(COMPARE QSORT)ARRAY
(session-output 不被认为是“function-result”——这需要显式赋值!)
- 另请注意,本地化变量名称被认为是一种好的做法。
我正在尝试在 APLX 中实现快速排序,但我似乎无法修复这个值错误,我一直从语句 :If((ITEM COMPARE PIVOT)≤0)
中得到这个错误。经过一些测试,我认为问题在于我在 For 循环中使用了 If 语句,但我不知道为什么会出现问题。这是整个函数(或更确切地说是运算符),以防万一问题出在其他地方:
(注意 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
嗯,恐怕我对 APLX 不熟悉,但无论如何,这是我的 0.02 美元:
- 你知道⍋吗?所以我认为这是一个教育练习......;-)
- 控制结构没有问题,但是你的
COMPARE
-fn 没有 return 结果,所以当你尝试使用结果时(参考COMPARE
),这会产生错误。函数头可能应该是∇ RESULT←(COMPARE QSORT)ARRAY
(session-output 不被认为是“function-result”——这需要显式赋值!) - 另请注意,本地化变量名称被认为是一种好的做法。