我想要做的是创建一个函数,它接受一个值列表和一个字符列表,并将相应的字符(我认为它们在技术上被称为“原子”)合并到一个新列表中。
这是我到目前为止所拥有的;
#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))))
答案 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)))