首页 文章

Scheme中的Scheme返回对

提问于
浏览
0

嗨我得到错误mcar: Contract 违规期待: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

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

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

    displayln 只是一个示例,如果需要,可以使用返回的结果执行其他操作 .

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

相关问题