嗨我得到错误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):
(定义帮助
(lambda(y listz)
(map(lambda(z)(list y z))
listz)))
(定义打印
(lambda(listy)
(条件
((null?listy)(换行))
(#t(helpy(car listy)(cdr listy)))
(print (cdr listy)))))
我认为我的递归错误了
答案 0 :(得分:0)
代码存在一些问题。首先,按惯例,cond
的“else”子句应以else
开头,而不是#t
。其次,null?
中的print
测试应该会收到listy
,而不是list
。第三,你没有对helpy
中print
返回的结果做任何事情,你只是在print
推进当前列表的cdr
而没有做任何事情使用递归调用返回的值。试试这个:
(define print
(lambda (listy)
(cond
((null? listy) (newline))
(else
(displayln (helpy (car listy) (cdr listy)))
(print (cdr listy))))))
displayln
只是一个示例,如果需要,可以使用返回的结果执行其他操作。
答案 1 :(得分: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))