所以我写了一些东西,返回一个最大子集和,给出一个正整数列表。但是,我想使用(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上面的代码在普通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)))))发布于 2015-06-19 03:06:23
由于这些行,您得到了一个无限循环:
(defun subset-sum (numbers capacity counter)
(let ((exclude (subset-sum (cdr numbers) capacity counter))您一直递归地调用子集和,并且它永远不会终止。即使到了列表的末尾,而且numbers是(),也可以继续下去,因为(cdr '())是'()。您在原始版本中通过检查(空号)来处理这个问题(尽管使用(endp数字)可能更符合惯例)。现在你可以做这样的事情:
(defun subset-sum (numbers capacity counter)
(if (endp numbers)
counter
(let ((exclude (subset-sum (cdr numbers) capacity counter))
;...
)
(cond ; ...
))))https://stackoverflow.com/questions/30928241
复制相似问题