2015-11-05 97 views
0

方案这样做/球拍新的列表递归的每个项目两个列表比较,返回与最小项

的问题是:取两个数字等长的名单,然后返回组成的最小数字位置的列表按位置。

例:listMins('(1 7 5) '(2 8 3))

回报(1, 7, 3)因为1<27<83<5

我是新来的函数式编程和弱的递归。我感觉好像我错过了一些我不知道如何在我的伪代码中解决的关键部分,以便我可以开始为真实代码编写代码。 (我想跳进代码首先,它没有工作,所以我退后一步,以伪代码。)

伪代码:

(listMins x, y)(
    (if !null A) 
     (if > listAitem listBitem) 
      (add A to newList) ;where do I make newList? 
      (add B to newList) 
     (return newList) 
) 

回答

8

这其实是非常容易的,如果你使用higher-像map这样的顺序函数,特别是因为Scheme的map可以接受很多参数,在这种情况下,它就像一个“zip”函数。这意味着它可以实现在一个单一的代码,简洁的线条您list-mins功能:

(define (list-mins . lsts) 
    (apply map min lsts)) 

它使用计划/球拍的一些比较复杂的机器,虽然如此,它可能不是很清楚发生了什么事情。虚线的说法,与apply配对允许list-mins采取任何数量的名单,但你真的只需要它来接受两个,所以这里有一个简单的版本:

(define (list-mins a b) 
    (map min a b)) 

这是什么呢?那么,map并行迭代其参数,对每组元素应用一个过程,然后用结果的元素产生一个新列表。 min函数只是返回其参数的最小值。要看看这是什么样子的动作,这里就是上面的代码基本上是这样做的:

(map min '(1 7 5) '(2 8 3)) 
=> (list (min 1 2) 
     (min 7 8) 
     (min 5 3)) 
=> (list 1 7 3) 

当然,有可能这个自己编写,也使用递归。做手工是这样的:

(define (list-mins a b) 
    (if (empty? a) 
     '() 
     (cons (min (first a) (first b)) 
      (list-mins (rest a) (rest b))))) 

这是非常简单,只是展开什么map做,并使用map直接得多清楚(它表达你的意图来遍历一组列表),所以它会比自己做递归更习惯。不过,如果你正在学习,那么明确的版本可能会更清晰。

+0

非常有帮助..我不知何故在我的笔记的'car'和'cdr'部分如此隧道,我完全错过了'map' ...绝对有助于让它看起来更快。非常感谢将地图min扩展到其实际步骤中,这非常有帮助。我最初对于如何在一个函数的“中间”返回一个新数组感到困惑不已,而对于我正在处理的下一个问题,我仍然在某种程度上,但我会尝试至少一个小时还有一半......再次感谢! –

相关问题