Lambda 取球拍中函数的倒数

Lambda 取球拍中函数的倒数,lambda,functional-programming,scheme,racket,Lambda,Functional Programming,Scheme,Racket,我正试图编写一个高阶Racket函数,它接受一个变量的一阶函数并返回其逆函数。我知道它必须从这样的事情开始: (let [(inverse (lambda (f) (lambda (y) ... )))]) 我只是想弄清楚什么是省略号 编辑: 对于有人说这是不可能的,我愿意接受一个逆函数,当给定y时,它返回一个可能的x。对于关于函数没有逆函数的评论,请注意我为f签订的合同。它是一个(数字?->数字?映射,因此有一个逆映射。考

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

(let [(inverse (lambda (f) (lambda (y) ... )))]) 我只是想弄清楚什么是省略号

编辑: 对于有人说这是不可能的,我愿意接受一个逆函数,当给定
y
时,它返回一个可能的
x
。对于关于函数没有逆函数的评论,请注意我为
f
签订的合同。它是一个
(数字?->数字?
映射,因此有一个逆映射。

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


因为一个非常简单的函数可能没有逆函数,所以不能期望一个普通的Scheme函数有逆函数

对于一般情况,给定一个任意函数
f
,你无法判断它的反函数是什么。更糟糕的是,给定的函数可能根本没有逆函数——例如:输入函数可以执行MD5哈希,而MD5哈希没有逆函数。抱歉,您的问题没有答案。

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

(define (inverse f) (lambda (y) (root (lambda (x) (- (f x) y))))) (定义(逆f) (兰姆达(y) (根(λ(x)((fx)yЮ)Ю) 这很容易理解。函数的逆函数是
x
,因此
f(x)=y
。显然,函数
f(x)-y=0的根是
x


我出错的地方是,对于根,我们能做的最好的方法是牛顿法或其他近似法。

@Roddyoff Frozenpeas:对不起,我编辑了这个问题,让它更清楚。丹尼尔,我想我们都很好奇你在这里想实现什么?这仅仅是对函数式编程的探索,还是对任务有一些实际的用例?因为到目前为止,两个答案都表明,这在数学上是不可能的。假设函数可以输出其中一个可能性。这个(定义(fx)(Let loop()(loop)42))怎么样?有倒数吗?那不是真正的函数。它不是X->Y的映射。不是数学意义上的映射,但它是一个很好的模式函数。是的,你是对的。我想错事了。请看我提供的答案。仍然可以在Racket中找到双射函数的逆。这是许多计算机代数系统的一个共同特征。 (define (inverse f) (lambda (y) (root (lambda (x) (- (f x) y)))))