2015-12-02 45 views
0

好吧,我真的很糟糕的计划,我一直在卡住这个功能(看它是一个非常简单的修复)。我想写一个关于列表输入是否是一个包的函数(一个包是元组中的第一个数字是值的第二个数字是一个元组列表,而且每个值都不应该重复并从最小到最大排序)。这是我有...语法可能是太可怕了......方案函数元组检查

(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 
+0

您可以添加示例输入和输出吗? – uselpa

+1

请使用正确的缩进。如果没有它,就无法阅读类似lisp的语言的代码.... –

+0

@KarolyHorvath s/without it //'FIFY lol j/k/s –

回答

2

是你的语法是相当糟糕。 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))))) 

这通过所有你的测试,并有你在评论中提到的其他限制。

+1

@ uselpa非常感谢你的帮助,我已经阅读了一些关于它的内容,但是对于这个课程,我们不断地改变语言,并结合其他课程,我没有时间按照自己的意愿去研究一次,一次该学期结束了(耶冬假期)我打算深入研究它,并希望大大改善我的语法,我不知道它是关于方案,但我似乎无法把握它,我需要找到一个非常好的一步一步的教程,我刚刚使用scheme.com作为参考 – elvenmagick

+0

Little Schemer是一个很好的介绍。简单的方案是一个中间参考,SICP是一个大问题。 – WorBlux