在Racket中取反函数

时间:2012-06-26 20:48:45

标签: lambda functional-programming scheme racket

我正在尝试编写一个更高阶的Racket函数,该函数接受一个变量的一阶函数并返回其反函数。我知道它必须从这样的事情开始:

(let [(inverse (lambda (f)
                 (lambda (y)
                   ... )))])

我认为这是因为inverse必须接受一个函数,该函数返回一个函数,该函数接受y并返回x,使得(= (f x) y)。换句话说,逆的契约就像是:

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

我只是难过想弄清楚elipses在哪里?

编辑: 在回答人们说这是不可能的时候,我愿意接受一个反函数,当给定y时,返回一个可能的x。在回复关于函数没有反转的评论时,请注意我对f的合同。它是(number? -> number?)映射,因此具有反转。

3 个答案:

答案 0 :(得分:6)

对于一般情况,给定一个任意函数f,你无法分辨它的反函数是什么。更糟糕的是,给定的函数可能根本没有逆 - 例如:输入函数可以执行MD5散列,它没有反转。对不起,您的问题没有答案。

答案 1 :(得分:3)

考虑f(x)= x ^ 2。这是一个非常简单的函数,没有逆。 (因为f(1)= f(-1),y = 1没有唯一的逆。)。

由于一个非常简单的函数可能没有逆,你不能指望一般的Scheme函数有一个逆。

答案 2 :(得分:2)

我知道我以前见过这个,但我不记得它是如何工作的。现在我记得了,但我意识到我在我的问题中误导了,因为我看到的版本假设我们已经有一个名为root的函数,它将返回一个提供函数的零。鉴于这个功能,这很简单:

(define (inverse f)
  (lambda (y)
    (root (lambda (x) (- (f x) y)))))

很容易看出它是如何工作的。函数的倒数是xf(x) = y。显然,函数f(x) - y = 0的根是x

我出错的地方是我们能为root做的最好的事情是牛顿方法或其他近似值。