【问题标题】:Recursive function to pretty-print the elements of a list用于漂亮打印列表元素的递归函数
【发布时间】:2013-11-04 21:38:23
【问题描述】:

我需要编写一个函数,它接受(int * int) list 类型的输入并打印成对的整数。这个函数应该利用另一个函数 printGenList (接受一个函数 f 和一个列表 l 并递归地将 f 应用于列表的每个元素),我写的代码是这样的 -

fun printGenList f l =
if NULL l
then ()
else ( (f (HD l) );  printGenList (f) (TL l)  );

并提供一个匿名函数(fn … => … 构造),该函数将执行适当的漂亮打印。

【问题讨论】:

    标签: list recursion sml smlnj


    【解决方案1】:

    类型签名告诉你有一个整数对列表。一对整数的一个例子是(4,1)。一个 list 对将是 [(a,b),(c,d),...],而不是你尝试过的一对整数列表。

    我相信您对(x::xs) 表示法很熟悉,因为您似乎对列表有所了解。如果我们要配对成对,我们可以这样做:((n,m)::xs)。此模式将 n 和 m 绑定到相应的 int 并将 xs 绑定到列表的其余部分。那么递归就很简单了:

    fun pInts [] = ()
      | pInts ((n,m)::xs) = print ("(" ^ Int.toString n ^ ", " Int.toString m ^ ")";
                            pInts xs
    

    从中收集到的重要一点是,您可以在一个模式中绑定多个变量并在您的函数中使用它们。如果您确定列表中有多个元素,您甚至可以一次绑定多个元素:

    fun pairs []         = []
      | pairs [x]        = []
      | pairs (x::y::xs) = (x,y) :: pairs xs
    

    【讨论】:

      【解决方案2】:

      你应该看看tuples 您实际上必须使用以下签名定义函数:

      fn : (int * int) list -> unit
      

      所以函数会是这样的:

      fun pr(lst :(int * int) list) : unit =
          case lst of
               [] => ()
              |(a,b) :: xs => let 
                                  val out = Int.toString a ^ Int.toString b
                              in 
                                  print(out);
                                  pr xs
                              end
      

      我希望你有基本的想法。尝试改进打印格式!

      【讨论】:

      • 接受这个答案:-)
      猜你喜欢
      • 2022-01-22
      • 2019-09-08
      • 2014-06-28
      • 2011-03-21
      • 2018-10-04
      • 2017-08-11
      • 2016-05-07
      • 2017-03-31
      • 2012-10-24
      相关资源
      最近更新 更多