2

関数型プログラミングの学習を続けているうちに、デフォルトの「手続き型」の考え方に代わるものはないかと考えるようになりました。より具体的には、私が書いた関数を見ています。これが何をするかです:

Swap two elements of an unordered list of numbers, such that one of the elements  
 is now in the right place
Add the sum of the swapped values to an accumulated total   
Repeat until list is sorted

そのため、現在、上記を行うために accum 変数を使用して標準の loop* を使用しています。それはうまく機能し、実生活での反復に間違いはありませんが、この演習のポイントは私の考え方を拡張することであるため、上記のアルゴリズムに対してより機能的なアプローチがあるかどうかに興味があります.

ありがとう!

*(実際には再帰ですが、なんでも)

4

2 に答える 2

1

再帰は基本的に関数型プログラミングメカニズムです。スワップ関数を、リストを取り込んでリストなどを返す関数に置き換えることもできると思いますが、実際に機能する言語で書かれていない限り、それは悪い考えです。

Oz、SML、Prolog、またはLispでマージソートを実装してみてください。たとえば、マージ用のこの擬似コードのようなもの:

Merge(A,[])=A
Merge(H|T,H2|T2)=iif(H<H2,H|Merge(T,H2|T2),H2|Merge(H|T,T2)
于 2008-11-25T18:17:17.077 に答える
1

EigenClassから:

由緒ある師匠リロイが弟子と歩いていた。見習いは、師匠と話し合いたいと思い、「師匠、すべてのループを末尾再帰関数に置き換える必要があると聞きましたが、本当ですか?」と言いました。リロイは彼の学生を憐れむように見て、「愚かな学生、多くの末尾再帰関数は単に非効率的なループです.」と答えた.

生徒はその後数週間をかけて、末尾再帰関数を明示的なループに置き換えました。彼はついにリロイをマスターするために彼のコードを示し、彼の承認を求めました. リロイは棒で彼を殴った。「いつ学習しますか? 明示的なループは、貧乏人の末尾再帰関数です。」その瞬間、生徒は悟りを開いた。

編集:OCamlの主な開発者であるXavier Leroyに言及

あなたの機能を見て、それがどれほど機能的*であるかを理解できないので、わかりません。しかし、あなたがしていることは正しいようです。私の主な提案は、関数型プログラミングに適したデータ構造を調べることです-しかし、リストを使用しているので、それはありませんが、この場合、リストは最良のデータ構造ではありません. アルゴリズムも同様。挿入ソートの使用に夢中になっている場合は、マージソートやその他のより効率的な方法を使用できない可能性があります。

于 2008-11-25T18:21:47.053 に答える