3

我想做的是创建一个函数,该函数接受一个值列表和一个字符列表,并将相应的字符(我认为从技术上讲它们会被称为“原子”)合并到一个新列表中。

这是我到目前为止所拥有的;

#lang racket
(define (find num char)
  (if (= num 1) 
     (car char)                                    ;Problem here perhaps?
     (find (- num 1) (cdr char))))


(define (test num char)
  (if (null? num)
    '("Done")
    (list (find (car num) (test (cdr num) char)))))

然而,这给了我一个错误,在大多数情况下,我理解它在说什么,但我看不出造成错误的原因是什么。给定以下简单的测试输入,这就是我得到的

> (test '(2 1) '(a b c))

car: contract violation
expected: pair?
given: '()

本质上,输出显然应该是'(b a)错误而不是错误。

对新方案用户的一点帮助和指导将不胜感激!

编辑:

这是我能够运行的代码。

#lang racket

(define (find num char)
  (cond ((empty? char) #f)
    ((= num 1) (car char))
    (else (find (- num 1) (cdr char)))))


(define (project num char)
  (if (empty? num)
    '()
    (cons (find (car num) char) (project (cdr num) char))))
4

3 回答 3

4

find过程大部分是正确的(尽管它基本上是在重新发明轮子并做同样的事情list-ref,但是好吧......)请小心,并且不要忘记考虑列表为空时的情况:

(define (find num char)
  (cond ((empty? char) #f)
        ((= num 1) (car char))
        (else (find (- num 1) (cdr char)))))

project另一方面,程序并不完全正确。您现在应该知道如何编写迭代列表并创建新列表作为答案的方法。我会给你一些提示,填空:

(define (project num char)
  (if <???>                    ; if num is empty
      <???>                    ; then we're done, return the empty list
      (cons                    ; otherwise cons
       <???>                   ; the desired value, hint: use find
       (project <???> char)))) ; and advance the recursion

这应该够了吧:

(test '(2 1) '(a b c))
=> '(b a)
于 2013-06-26T05:49:40.973 回答
0

迟到总比不到好:

(define (coalesce nums chars)
  (map (lambda (num) (list-ref chars (- num 1))) nums))
于 2013-06-26T14:05:03.863 回答
0

具有高阶函数

#lang racket

(define (find num chars)
  (cond ((empty? chars) #f)
    ((= num 1) (car chars))
    (else (find (- num 1) (cdr chars)))))

(define (project nums chars)
 (let ((do-it (lambda (num) (find num chars))))
  (map do-it nums)))
于 2013-06-26T14:23:43.290 回答