Scheme中的Scheme返回对

时间:2012-11-18 21:48:04

标签: scheme racket

嗨我得到错误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)))))

我认为我的递归错误了

2 个答案:

答案 0 :(得分:0)

代码存在一些问题。首先,按惯例,cond的“else”子句应以else开头,而不是#t。其次,null?中的print测试应该会收到listy,而不是list。第三,你没有对helpyprint返回的结果做任何事情,你只是在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))