Обновлен код: схема / ракетка: чтение моего аргумента в виде списка - PullRequest
0 голосов
/ 14 ноября 2018

Я обновил свой код, и хотя я не пришел к решению, я попал туда. Это домашнее задание, поэтому я не ищу кого-то, кто решит это за меня. Я хочу решить это самостоятельно. Просто хотел показать мой прогресс.

(define has-subtarget?(lambda(ls thirdVal sumA sumB)
                    (cond
                      ((and (null? (cdr ls)) (= sumA sumB) (= sumA sumB) (= sumA thirdVal) (> sumA 0) (> sumB 0)))
                      (null? (cdr ls))
                     (else                                  
                       (has-subtarget?(cdr ls) thirdVal (+ (car ls) sumA) sumB)
                       (has-subtarget?(cdr ls) thirdVal sumA (+ (car ls) sumB))
                       (if (= thirdVal 0)
                           (has-subtarget?(cdr ls) (car ls) sumA sumB)
                       ))
                     )
                     #f
                    ))

Ниже мой оригинальный код, который выдавал мне ошибку:

"+: contract violation expected: number? given: last argument position: 1st"

Я понял, что по какой-то причине он читает мой (+ addToA sumA) в виде списка, а не значение желания вернуться из дополнения, чтобы моя рекурсивная программа работала.

Вот как я вызываю свою функцию:

(has-subtarget? 0 0 0 0 0 '(1 2 3 4)) 

(define has-subtarget?
  (lambda (addToA addToB thirdSetVal sumA sumB lst)
      (cond
     ((and (and (and (and (null? (cdr'(lst))) (= sumA sumB)) (> 0 sumA)) (> 0 sumB)) (= sumA thirdSetVal)) #t)
     (else
          (has-subtarget? 0 (car'(lst)) thirdSetVal (+ addToA sumA) (+ addToB sumB) (cdr'(lst)))
                    (has-subtarget? (car'(lst)) 0 thirdSetVal (+ addToA sumA) (+ addToB sumB) (cdr'(lst)))

          (if((or(and (= sumA 0) (= sumB 0)) (= thirdSetVal 0)))
             (has-subtarget? 0 0 (car'(lst)) (+addToA sumA) (+ addToB sumB) (cdr'(lst))))

          )))


    )
...