嗨,我收到错误 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
。其次,print
的null?
测试应该接受listy
,而不是list
。第三,你没有对helpy
在print
中返回的结果做任何事情,你只是在当前列表的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))