2016-10-16 6 views
1

APLXでquicksortを実装しようとしていますが、この値のエラーを修正できないようですが、文:If((ITEM COMPARE PIVOT)≤0)から取得し続けます。いくつかのテストの後、私は問題がForループ内でIf文を使用しているという事実にあると信じていますが、なぜそれが問題になるのか分かりません。ここでの問題は、他の場所である念のために全体の機能(あるいは、むしろオペレータ)、です:APL/APLX:forループ内でifステートメントを使用すると値エラーが発生する

(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 

答えて

2

うーん(COMPAREよりノートは、私がクイックに渡すコンパレータ機能です)、私は怖いI私はAPLXに慣れていませんが、ここには私の0.02 $は関係ありません:

  1. ⍋について知っていますか?したがって、私はこれが教育機関であると仮定します... ;-)
  2. 制御構造に問題はありませんが、COMPARE -fnは結果を返さないため、結果を使用すると〜COMPARE)、エラーを作成します。関数ヘッダは、おそらく∇ RESULT←(COMPARE QSORT)ARRAYセッション出力は「機能-結果」とみなされていません! - これは、明示的な割り当てを必要と)されなければならない
  3. はまた、変数のローカライズ名は良い習慣と見なされることに注意してください。
+0

ありがとうございました。私のCOMPARE機能では戻り値がありませんでした。私はAPLの値を返すことはRubyで値を返すような印象を受けていました。 – wptreanor

+0

ここでQuicksortをコーディングしていたとき、昨日Dyalogのブログを閲覧しているうちに、私はこれらの2つが興味深いかもしれないことを知った;-) http://www.dyalog.com/blog/2014/12/quicksort-in-apl/とhttp: //www.dyalog.com/blog/2016/02/quicksort-in-apl-revisited/ – MBaas

+0

wow APLは、私が思ったよりもはるかに簡潔です。リンクありがとう! – wptreanor

関連する問題