方案功能元组检查

scheme function tuples check

好吧,我真的很不擅长方案,而且我一直卡在这个功能上(看它是一个非常简单的修复)。我正在尝试编写一个函数来判断列表输入是否是一个包(一个包是一个元组列表,其中元组中的第一个数字是值,第二个数字是基数,而且每个值都不应该重复并从小到大排序)。这就是我所拥有的...语法可能很糟糕...

 (define (bag? qbag)
  (cond ((null? qbag) #t)
        (if(eqv? (pair? (car qbag)) #t)
           (baghelp (cdr qbag) (car(car qbag))))
        (else (#f))))

(define (baghelp qbag x)
 (cond((null? qbag) #t)
      (if(and(if (eqv? (pair? (car qbag)) #t))
             (if (< x (car(car qbag)))))
         (baghelp (cdr qbag) (car(car qbag)))
      (else(#f)))))

示例输入输出:

(bag? '((0 1)))
#f
(bag? '())
#t
(bag? '10)
#f
(bag? '((5 2) (4 3)))
#f
(bag? '((5 2) (7 3)))
#t
(bag? '((5 1 0)))
#f
(bag? '((5 5) (5 2)))
#f

是的,你的语法很糟糕。你在 cond 中使用 if 的方式和 (#f) 这样的表达式让我觉得你到现在为止一直在避开 Scheme 文献......真的,读一本好的教程,那是必须的。

下面是我将如何编写此代码的示例(或多或少;我会排除 (car bag)(caar bag) 的重复使用,但这样它对您来说可能更具可读性):

(define (bag? bag)
  (and (list? bag) (bag-help bag '())))

(define (bag-help bag last-val)
  (or (null? bag)
      (and (list? (car bag))
           (> (caar bag) 0)
           (= 2 (length (car bag)))
           (or (null? last-val) (< last-val (caar bag)))
           (bag-help (cdr bag) (caar bag)))))

这通过了您的所有测试并具有您在评论中提到的其他限制条件。