Я обновил свой код, и хотя я не пришел к решению, я попал туда. Это домашнее задание, поэтому я не ищу кого-то, кто решит это за меня. Я хочу решить это самостоятельно. Просто хотел показать мой прогресс.
(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))))
)))
)