7

私は関数型プログラミングのバックグラウンドを持っており、反復的な問題ではなく、問題に対する再帰的な解決策について最初に考えています。私は Rebol (具体的には R3) を少し使用し始めており、アキュムレータを使用した末尾再帰関数を使用して素因数カタのソリューションを作成しました。しかし、十分に大きな入力があると、スタックを吹き飛ばします。私は、「tail-func.r」と呼ばれる Rebol2 用のスクリプトを持っています。これは、AFAIK が R3 に移植されていないバージョンの末尾呼び出し最適化を実装しています。多くの場合、Rebol 3 は R2 とは異なる方法で実装されていることは知っていますが、追加のコードなしで Rebol 3 で TCO を取得する方法はありますか? そうでない場合、古いスクリプトを移植せずに入手する簡単な方法はありますか?

私のコードを追加するために編集:

primefactors: function [n m factors] [
  either n > 1
    [ either (modulo n m) == 0
      [ primefactors (n / m) m (append factors m) ]
      [ primefactors n (m + 1) factors ] ]
    [ factors ]
  ]

  primefactors 30 2 (copy []) => [2 3 5]
4

1 に答える 1

3

コードなしではありません、申し訳ありません。Rebol はコンパイルされていないため、テール コールを構成するものを事前に正確に知る方法はありません。関数への呼び出しでさえreturn、goto ではなく迅速にコール スタックに反映されます。

tail-func の作成者である IIRC は、現在 Rebol 3 に取り組んでおり、彼が行うかどうかにかかわらず、簡単に移植できるはずです。あなたがそれを言及したので、私は見てみましょう。関数ジェネレーターとプリプロセッサーは、Rebol で簡単に実行できます。

于 2014-03-05T03:44:34.267 に答える