首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >常用Lisp:使用(let)计算递归函数

常用Lisp:使用(let)计算递归函数
EN

Stack Overflow用户
提问于 2015-06-19 00:50:27
回答 1查看 714关注 0票数 1

所以我写了一些东西,返回一个最大子集和,给出一个正整数列表。但是,我想使用(let),以便使代码更高效。我想知道这是否可能或如何可能。

代码语言:javascript
复制
(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会使代码更好。但是我写的是一个无限循环:(这是一个人工智能入门类的作业.帮帮新手吧!

代码语言:javascript
复制
(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)))))
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-19 03:06:23

由于这些行,您得到了一个无限循环:

代码语言:javascript
复制
(defun subset-sum (numbers capacity counter)
  (let ((exclude (subset-sum (cdr numbers) capacity counter))

您一直递归地调用子集和,并且它永远不会终止。即使到了列表的末尾,而且numbers(),也可以继续下去,因为(cdr '())'()。您在原始版本中通过检查(空号)来处理这个问题(尽管使用(endp数字)可能更符合惯例)。现在你可以做这样的事情:

代码语言:javascript
复制
(defun subset-sum (numbers capacity counter)
  (if (endp numbers)
    counter
    (let ((exclude (subset-sum (cdr numbers) capacity counter))
          ;...
         )
      (cond ; ...
          ))))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30928241

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档