3

1つの変数の1次関数を取り、その逆関数を返す高階ラケット関数を作成しようとしています。私はそれがこのような何かから始めなければならないことを知っています:

(let [(inverse(lambda(f)
                 (ラムダ(y)
                   ...)))])

を取り、次のように返すinverse関数を返す関数をとらなければならないので、これを考えました。言い換えれば、逆の契約は次のようなものです。yx(= (f x) y)

; inverse : (number? -> number?) -> (number? -> number?)

楕円がどこにあるのかを理解しようとして困惑していますか?

編集:これは不可能だと言う人々に応えて、私は与えられたときにy可能性を返す逆関数を喜んで受け入れますx。逆関数を持たない関数についてのコメントに応えて、私が持っている契約に注意してくださいf。これは(number? -> number?)マッピングであるため、逆になります。

4

3 に答える 3

6

一般的なケースでは、任意の関数が与えられた場合、fその逆関数が何であるかを知ることはできません。さらに悪いことに、特定の関数が逆関数をまったく持たない場合があります。たとえば、入力関数が逆関数を持たない MD5 ハッシュを実行する可能性があります。申し訳ありませんが、あなたの質問には答えがありません。

于 2012-06-26T21:14:14.080 に答える
3

f(x)=x^2 と考えてください。これは逆関数のない非常に単純な関数です。(なぜなら f(1)=f(-1) は y=1 に固有の逆がないからです)。

非常に単純な関数には逆関数がない可能性があるため、一般的な Scheme 関数に逆関数があるとは期待できません。

于 2012-06-26T21:08:24.420 に答える
2

以前にこれを見たことがあることは知っていましたが、どのように機能したか思い出せませんでした。今思い出しましたが、私が見たバージョンでrootは、提供された関数のゼロの1つを返す関数が既に呼び出されていると想定していたため、質問で誤解を招いていたことに気付きました。その機能を考えると、それは非常に簡単です:

(定義 (逆 f)
  (ラムダ (y)
    (ルート (ラムダ (x) (- (fx) y)))))

これがどのように機能するかは非常に簡単です。関数の逆関数は、そのxようなものf(x) = yです。明らかに、関数のルートf(x) - y = 0はそれxです。

私が間違っていたところは、私たちができる最善rootの方法は、ニュートン法またはその他の近似であるということです.

于 2012-06-26T22:04:16.017 に答える