Ocaml N次函数合成
我需要编写一个代码来组成一个函数f(x),它本身使用递归函数N次 我写的是:Ocaml N次函数合成,ocaml,Ocaml,我需要编写一个代码来组成一个函数f(x),它本身使用递归函数N次 我写的是: let f x = x + 1 (*it can be any function*) let rec compose n f x = if n = 0 then "Can't compose anymore" else compose (n-1) f (f x);; 这显然是不对的。我知道代码还没有完成,但我不知道如何继续。我走对了吗?你能告诉我怎么解决这个问题吗?你走的路是对的。根据
let f x = x + 1 (*it can be any function*)
let rec compose n f x = if n = 0 then
"Can't compose anymore"
else compose (n-1) f (f x);;
这显然是不对的。我知道代码还没有完成,但我不知道如何继续。我走对了吗?你能告诉我怎么解决这个问题吗?你走的路是对的。根据要求,我将尝试从以下等式开始:
compunere 1 f x == f x
如上所述,将f
应用于x
一次与执行(f x)
完全相同
同样,应用f
两次应该计算f(fx)
。如果您通过调用计算机
来替换(f x)
,则您有:
compunere 2 f x == f (f x) = f (compunere 1 f x)
递归的一般模式似乎是:
compunere n f x == f (compunere (n - 1) f x)
请注意,f
的最一般类型是a->b
,但是当使用类型b
的值再次调用f
时,这意味着a
和b
应该是相同的类型,因此f
实际上是一个自同态,一个a->/code>类型的函数。这是N>=1的情况,但在N=0的退化情况下,可能会有不同的行为
将f
零时间应用于x
可能意味着“返回x”,这意味着computere
理论上可以为零返回a
类型的值,因为任何f
都是a->b
函数,a
和b
可能不同;您可以用更多的代码来区分这两种情况,但这里我们可以简单地让typechecker在所有情况下强制执行a=b
的约束,并具有统一的行为。您还可以通过抛出异常使0无效(如负数)(从理论上讲,负数应用程序可能是反函数的正向应用程序,但当您对f一无所知时,您无法计算该值;f可能是不可逆的)
您的代码有点不同:
compunere 3 f x == (compunere 2 f (f x))
== (compunere 1 f (f (f x)))
== (compunere 0 f (f (f (f x))))
...
这种方法的优点是,对computere
的递归调用直接给出当前计算的结果:它位于尾部位置,允许编译器执行尾部调用消除
当达到N=0时,本地绑定的值x
将给出所需的结果。这里,对于N=0作为输入,唯一自然的解释也是返回x
是否缺少代码?let的表达式。。。。。在
中定义要在下一行中使用的变量。但最后一行在
中以结尾。您应该使用OCaml顶层来至少确认您的语法是正确的。这可能就是你被否决的原因。没有代码缺失。我只是不知道如何继续,所以我写下了我到目前为止写的东西。
compunere 2 f x == f (f x)