3

我正在尝试编写一个高阶 Racket 函数,该函数采用一个变量的一阶函数并返回其逆函数。我知道它必须以这样的方式开始:

(让 [( 逆 (lambda (f)
                 (λ (y)
                   ... )))])

我认为这是因为inverse必须采用一个函数,该函数返回一个函数,该函数采用 ay并返回x这样的(= (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,它将返回所提供函数的零之一。鉴于该功能,这很容易:

(定义(逆 f)
  (λ (y)
    (根 (lambda (x) (- (fx) y)))))

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

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

于 2012-06-26T22:04:16.017 回答