我正在尝试编写一个更高阶的Racket函数,该函数接受一个变量的一阶函数并返回其反函数。我知道它必须从这样的事情开始:
(let [(inverse (lambda (f) (lambda (y) ... )))])
我认为这是因为inverse
必须接受一个函数,该函数返回一个函数,该函数接受y
并返回x
,使得(= (f x) y)
。换句话说,逆的契约就像是:
; inverse : (number? -> number?) -> (number? -> number?)
我只是难过想弄清楚elipses在哪里?
编辑:
在回答人们说这是不可能的时候,我愿意接受一个反函数,当给定y
时,返回一个可能的x
。在回复关于函数没有反转的评论时,请注意我对f
的合同。它是(number? -> number?)
映射,因此具有反转。
答案 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)))))
很容易看出它是如何工作的。函数的倒数是x
,f(x) = y
。显然,函数f(x) - y = 0
的根是x
。
我出错的地方是我们能为root
做的最好的事情是牛顿方法或其他近似值。