方案返回列表中的对



嗨,我收到错误 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)).

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

(定义帮助

(λ (y listz)

(地图 (λ (z) (列表 y z))

列表

)))

(定义打印

(λ(列表)

(电报)

(空?列表)(换行符))

(#t (帮助 (汽车列表) (CDR 列表)))

(print (cdr listy)))))

我认为我的递归有问题

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

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

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

我尝试像这样实现:

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

最新更新