我坚持使用此SML作业。我正在尝试创建一个复合函数(有趣的化合物n f)。它应该将函数f自身应用n次,例如,化合物3 f将等于f(f(f(x)))。我得到它的工作,除了n为零的情况。我问教授,但他不会直接回答我。他试图给我一个暗示“什么功能时间为零?”我还是无法弄明白。 stackoverflow可以搞清楚吗?
感谢。
我的代码:
fun compound n f =
if n < 2 then
if n = 0 then fn x => f x else fn x => f x
else fn x => f(compound (n-1) f(x));
示例:
val fnc = fn x => x + 1; (* example function to be used *)
compound 5 fnc(10); (* will return 15 which is correct*)
compound 0 fnc(10); (* returns 11, should be 10 *)
答案:
fun compound n f =
if n < 2 then
if n = 0 then fn x => x else fn x => f x
else fn x => f(compound (n-1) f(x));
答案 0 :(得分:1)
我不会给你最后的答案,因为我不喜欢让教师不高兴;)但是,我会尝试推导一个我认为你很容易完成的推导。
让我们从一个非常简单的案例开始。让我们重新实现&#34;函数应用程序,即让我们编写一个函数,它接受一个函数和一个参数,并将第一个参数应用于第二个参数:
fun apply f a = f a
让我们使用一个增加整数的人为功能进行测试:
- fun inc n = n + 1;
val inc = fn : int -> int
- inc 1;
val it = 2 : int
- apply inc 1;
val it = 2 : int
现在,让我们编写apply2
,一个接受函数和参数的函数,并将参数两次应用于参数:
fun apply2 f a = f (f a)
让我们用inc
测试它:
- apply2 inc 1;
val it = 3 : int
似乎有效。正如您所料,我们现在实施apply3
,apply4
等等。让我们马上看一些:
fun apply f a = f a
fun apply2 f a = f (f a)
fun apply3 f a = f (f (f a))
fun apply4 f a = f (f (f (f a)))
看起来我们可以用之前的那些重写后来的那些:
fun apply2 f a = f (apply f a)
fun apply3 f a = f (apply2 f a)
fun apply4 f a = f (apply3 f a)
我们甚至可以重写apply
:
fun apply f a = f (apply0 f a)
请记住先前对apply
的定义,它们相当于:
fun apply f a = f a
那么,apply0
应该是什么?
fun apply0 f a = ...
答案 1 :(得分:0)
此算法的基本情况是什么?即递归终止时n
的值是多少?当它终止你什么回来?如果f
未应用于x
,请考虑您希望返回的内容。在您的示例的上下文中,如果将fnc
应用于10
零次,应该返回什么内容?
fun compound n f =
(* If n equals the termination value, then return the base case*)
if n = ?
else fn x => f(compound (n-1) f(x));
此处存在一种模式,存在于递归算法的基本情况中。例如,没有元素的列表的总和是多少?或者,没有元素的列表的长度是多少?