在初学者计划中,我如何使用和组合两个列表?

时间:2013-03-18 22:00:12

标签: scheme racket

我正在尝试找出一个问题,该问题包含名字列表和姓氏列表,并使用名字的第一个字母和最多7个姓氏的字母创建一个新的电子邮件地址列表和@ yahoo.com。

例如: (check-expect(电子邮件列表(列表“John”“Sarah”)(列表“King”“Dickinson”))(列表“jking@yahoo.com”“sdickins@yahoo.com”))

(check-expect(电子邮件列表为空)为空)

到目前为止,我有:

(define (appendnames alof alos)
  (cond [(and (empty? alof) (empty? alos)) empty]
        [else (string-append 
                (substring (first alof) 0 1) 
                (cond [(< (string-length (first alos)) 8) (first alos)]
                      [else (substring (first alos) 0 7)]) 
                "@yahoo.com")]))

(define (emails-list alof alos)
  (cond [(and (empty? alof) (empty? alos)) empty]
        [else (appendnames alof alos)]))

我不知道怎么做的是如何使第一个字母小写以及放在递归的位置,以便附加名称(appendnames(rest alof)(rest alos))。非常感谢我能得到任何帮助!

2 个答案:

答案 0 :(得分:1)

嗯,这看起来像是家庭作业所以我会给你一些提示,如果你试图通过自己的方式解决问题会好得多。第一件事是 - 将问题分成两部分,使其更简单:

(define (emails-list alof alos)
  (if <???>                              ; if any of the lists is empty
      <???>                              ; return the empty list
      (cons (make-email <???> <???>)     ; create a new email with current values
            (emails-list <???> <???>)))) ; and advance the recursion

当然,有趣的部分是创建实际的电子邮件。请参阅可用的characterstring程序,以下是一般概念:

(define (make-email name surname)
  (<???>                    ; convert the whole string to lowercase
   (<???>                   ; append the three parts of the email
    (string (<???> name 0)) ; create a new string with the frist char in name
    <???>                   ; create a substring with last name (*)
    "@yahoo.com")))         ; add the email domain

标有(*)的步骤需要更多解释。请注意,我们感兴趣的是最多来自姓氏的七个字符,只要我们记住结束索引是7或者是substring程序,就可以轻松获得{{1}}程序。 string的长度,如果字符串的长度小于7。

答案 1 :(得分:0)

如果你还没有读过它,你应该阅读HtDP的这一章,它解释了如何设计带有两个复杂输入的函数:

http://htdp.org/2003-09-26/Book/curriculum-Z-H-22.html

HtDP章节讨论了需要处理两个复杂参数的三种情况(或“案例”)。哪种情况符合您要解决的问题?

你应该有多少cond条款?这些是什么?你有什么可以在每个条款的答案部分工作? (换句话说,函数的模板是什么?)

一旦你走得那么远,填写代码应该很容易。如果您遇到困难,请使用具体示例来帮助您。