2016-02-13 73 views
0

我正在尝试在名为allAssociation的方案中创建一个函数。它需要2个参数,一个符号列表和一个关联列表。调用这个函数应该返回一个数据列表,其中包含与关联列表的键相对应的元素。使用关联列表和映射的方案功能

下面是一个例子:

输入:

(allAssociation '(a c d) '((a allen)(b bob)(c (carl cooper))(d doug))) 

输出:

(allen (carl cooper) doug). 

我试图使用地图和lambda来实现这个功能,但我有点为难。

目前我有这个代码片段:

(define AllAssociation 
    (lambda (key alist) 
    (if (null? alist) 
     '() 
     [insert rest of logic] 
      ))) 

但我与执行使用地图匹配每一个与关联列表的关键要素的逻辑挣扎。任何帮助将非常感谢,因为我对计划非常陌生。谢谢。

+1

对于在第一各要素e列表中,您想要在第二个列表中获取与e相关联的值。您可以在第一个列表中调用'map',并使用'assoc'在第二个列表中搜索。 – coredump

回答

1

基本上,您将遍历keys列表,并使用assoc来检索列表lst中的第一个匹配元素。

如果您需要使用map(如文本提示),那么这样的事情会做:

(define all-association 
    (lambda (keys lst) 
     (map (lambda (key) (cadr (assoc key lst))) 
      keys))) 

如果你必须这样做没有map(如代码提示),相当于将:

(define all-association 
    (lambda (keys lst) 
    (if (null? keys) 
     '() 
     (cons (cadr (assoc (car keys) lst)) 
       (all-association (cdr keys) lst))))) 

测试:

> (all-association '(a c d) '((a allen)(b bob)(c (carl cooper))(d doug))) 
'(allen (carl cooper) doug)