函数式编程中“函数时间为零”时函数返回什么?

时间:2015-03-16 21:57:13

标签: sml

我坚持使用此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));

2 个答案:

答案 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

似乎有效。正如您所料,我们现在实施apply3apply4等等。让我们马上看一些:

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));

此处存在一种模式,存在于递归算法的基本情况中。例如,没有元素的列表的总和是多少?或者,没有元素的列表的长度是多少?