個人的には、これはlocal
の重要性の貧弱な例だと私は思っています。あなたはこの質問の重要性を完全に理解しているとは思わないので、私がすることは、あなたの例を見て、最後にあなたに良い例を与えてください。
CONCEPT
まず第一に、(多くとりわけ)、ここで地元のアイデアは、コードのスニペットの意味を明らかにすることです。
はあなたの例を考えてみましょうあなたの例では、あなたが正しいように見えるm
と呼ばれる地元の定数を定義します。しかし、m
の文字は意味がありませんので、あなたの解決策は不明です。だから、私たちはあなたのソリューションをどのように修正するのでしょうか?
m
には、が明らかにという名前で、m
の識別名を指定する必要があります。
:だから、私たちは直接まあ
(maxi (rest alon))
は、単にので
m
find-max
に名前を変更することができます今、あなたのコードがどのように見える
(rest alon)
の最大数を見つけると言う(maxi (rest alon))
である何を表すかm
考慮することから始めます
;; maxi : non-empty-lon -> number
;; to determine the largest number on alon
(define (maxi alon)
(cond
[(empty? (rest alon)) (first alon)]
[else (local ((define find-max (maxi (rest alon))))
(cond
[(> (first alon) find-max) (first alon)]
[(> find-max (first (rest alon))) find-max]
[else (first (rest alon))]))]))
m
をfind-max
に置き換えると、コードがはっきりとわかります!我々はの経験則のままで、定数に意味のある名前をつけてください。さらに明確にするため
MY例
、2つの点を消費し、2点を結ぶことにより作成された線分の傾きを生成する機能を検討することができます。
;;where x1,y1 belong to point 1 and x2,y2 belong to point 2
(define (find-slope x1 y1 x2 y2)
(sqrt (+ (sqr (- x2 x1))) (sqr (- y2 y1))))
しかし、我々はlocal
を使用して明確にすることができます:私たちの最初のアプローチがあるかもしれない
(define (find-slope x1 y1 x2 y2)
(local
[(define delta-x (- x2 x1))
(define delta-y (- y2 y1))]
(sqrt (+ (sqr delta-x)) (sqr delta-y))))
デルタ関数は、その部分で何をするかを説明しどのように注意してください。 xまたはyの変化を見つける。だから、ここで学ぶ必要があるのは、最初の解決策でコードを少なくしても、にはが記載されていて、簡単に読むことができるということです。それは疑問の全体的な考えであり、それは馬鹿に見えるかもしれませんが、学問の場面で学習のスキームを強調するのは大変なことです。
第1の解決策と第2の解決策の効率については、第2の解決策は明白な理由からはるかに高速です(ラケットが表現を評価する方法を見てから)。
希望これは
あなたのための[宗教的な質問](http://en.wikipedia.org/wiki/Socratic_questioning)があります:あなたはなぜ非ローカルバージョンが「おそらくもっと速い」と思いますか?私はあなたの考えを聞いた後、この質問に本当の答えを投稿します。 :-) –
シフクリス、ASS-umptionsに質問してくれてありがとう。私はあなたの洞察力をますます高く評価することを学んでいます。したがって、リストが大きくなると、「ローカル」バージョンは「純粋な」再帰バージョンよりもはるかに高速です。この結論には、20の数値を持つリストのtime関数を呼び出すことで到着し、平均で550xのパフォーマンスの差が見られることに驚いた。私はRacket/Schemeが内部的にどのように不一致を説明するのか分からない。 "ローカル"バージョンを実行すると、ローカル関数 "m"の20バージョンが値を生成していることがわかります。 – Greenhorn