使用scheme / racket从列表中返回特定项目

时间:2013-06-26 05:24:02

标签: lisp scheme racket

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

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

#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))))

3 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

迟到总比没有好:

(define (coalesce nums chars)
  (map (lambda (num) (list-ref chars (- num 1))) nums))

答案 2 :(得分: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)))