Поэтому я написал что-то, что возвращает максимальную сумму подмножества, учитывая список положительных целых чисел. Однако я хотел бы использовать (let), чтобы сделать код более эффективным. Я хотел бы знать, если и как это возможно.
(defun subset-sum1 (numbers capacity)
(subset-sum numbers capacity 0))
(defun subset-sum (numbers capacity counter)
(cond ((null numbers) counter)
((= counter capacity) counter) ;; return if counter 'hits' the capacity
((< capacity (+ (car numbers) counter))
(subset-sum (cdr numbers) capacity counter)) ;; cdr if car branch exceeds capacity
((<= (subset-sum (cdr numbers) capacity counter)
(subset-sum (cdr numbers) capacity (+ (car numbers) counter)))
(subset-sum (cdr numbers) capacity (+ (car numbers) counter))) ;; choose car
(t (subset-sum (cdr numbers) capacity counter)))) ;; choose cdr
Приведенный выше код отлично работает в common lisp. Но я хотел бы сделать что-то вроде приведенного ниже, потому что мне кажется, что использование let улучшит код. Но то, что я написал, зацикливается :( Это задание для вводного класса по ИИ... помогите новичку, пожалуйста!
(defun subset-sum (numbers capacity counter)
(let ((exclude (subset-sum (cdr numbers) capacity counter))
(include (subset-sum (cdr numbers) capacity (+ (car numbers) counter))))
(cond ((null numbers) counter)
((= counter capacity) counter)
((< capacity (+ (car numbers) counter)) exclude)
((<= exclude include) include)
(t (exclude)))))