0

嗨,我收到了错误 mcar:合同违反预期:mpair?给定:()在运行这些代码时:

(define helpy 
  (lambda (y listz)
    (map (lambda (z) (list y z))
         listz)))

(define print
  (lambda (listy)
    (cond
      ((null? list) (newline))
      (#t (helpy (car listy) (cdr listy))
          (print (cdr listy))))))

我的代码试图在列表中返回对。例如,当我调用 (print '(a b c))它时应该返回((a b) (a c) (b c)).

我只是修复和更新我的代码,现在它不返回错误但我只能得到对((ab)(ac),运行这些代码时:

(定义帮助

(lambda (y listz)

(map (lambda (z) (list yz))

列表z)))

(定义打印

(拉姆达(列表)

(条件

((null?listy) (换行符))

(#t (helpy (car listy) (cdr listy)))

(print (cdr listy)))))

我认为我的递归有问题

4

2 回答 2

0

代码有几个问题。首先,按照惯例, a 的“else”子句cond应该以 a 开头else,而不是 a #t。其次,null?测试中print应该收到listy,而不是list。第三,你没有对helpyin返回的结果做任何事情print,你只是在当前列表上前进printcdr而不对递归调用返回的值做任何事情。试试这个:

(define print
  (lambda (listy)
    (cond
      ((null? listy) (newline))
      (else
       (displayln (helpy (car listy) (cdr listy)))
       (print (cdr listy))))))

displayln只是一个示例,如有必要,请对返回的结果执行其他操作。

于 2012-11-18T21:59:01.140 回答
0

我尝试这样实现:

#lang racket

(define data '(a b c d))

(define (one-list head line-list)
  (if (null? line-list)
      null
      (cons
       (cons head (car line-list))
       (one-list head (rest line-list)))))

(letrec ([deal-data
           (lambda (data)
             (if (null? data)
                 '()
                 (append
                  (one-list (car data) (rest data))
                  (deal-data (rest data)))))])

  (deal-data data))

运行结果:

'((a . b) (a . c) (a . d) (b . c) (b . d) (c . d))
于 2012-11-19T08:01:08.960 回答