首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >方案,停止我的递归

方案,停止我的递归
EN

Stack Overflow用户
提问于 2012-07-24 07:10:30
回答 2查看 364关注 0票数 0

函数firstnprimes应该返回第一个n素数。参数是从2-m个整数中抽取素数,nlist a list。slist是解决方案列表,最初是空的,每次调用firstnprimes都会被添加并重新构造。

它的工作方式是从列表中删除第一个数字,然后使用listminusnonprimesnlist中删除该数字的所有倍数;我知道这是有效的。问题是我不能控制这个动作,我计算每一遍,如果slist的长度等于你想要的素数,那么你就完成了。

代码:

代码语言:javascript
复制
(define firstnprimes
  (lambda (n nlist slist)
   (let ((slist (cons (car nlist) slist)))
    (if (zero? n)
        slist
        (firstnprimes (- n 1) (listMinusNonprimes (car nlist) (car nlist) nlist) slist)))))


(define listminusnonprimes
     (lambda (num d lst)
       (if (null? lst)
           '()
           (if (= d (car lst))
               (listminusnonprimes num (+ num d) (cdr lst))
               (cons (car lst) (listminusnonprimes num d (cdr lst)))))))
EN

回答 2

Stack Overflow用户

发布于 2012-07-24 09:26:18

您对listminusnonprimes的定义是错误的。想象一下调用(listminusnonprimes 3 3 '(3 5 7 9 11 ...)) (因为在删除2的所有倍数之后会发生这种情况)。现在3被删除了,您递归地调用(listminusnonprimes 6 3 '(5 7 9 11 ...)),但是6不在那里,所以调用什么也不做,结果是(3 5 7 9 11 ...)

我建议使用mod操作实现此函数。

票数 1
EN

Stack Overflow用户

发布于 2012-07-24 12:18:23

你不需要(let ((slist (cons (car nlist) slist)))。同样,使用append而不是cons,如下所示

代码语言:javascript
复制
(define firstnprimes
  (lambda (n nlist slist)
    (if (zero? n)
        slist
        (firstnprimes (- n 1) (listminusnonprimes (car nlist) (car nlist) nlist) (append slist (list (car nlist)))))))

所以,

代码语言:javascript
复制
(firstnprimes 2 '(2 4 7 9 21 36) '()) => '(2 7)
(firstnprimes 3 '(2 4 7 9 21 36) '()) => '(2 7 9)

然而,你的实现中有很多问题。首先,列表必须按递增顺序排列。此外,列表必须以质数开头。此外,nlist中质数的数量必须小于或等于n(firstnprimes 4 '(2 4 7 9 21 36) '()) => '(2 7 9 21)是错的

这里是你的概念的一个更好的实现。

代码语言:javascript
复制
(define firstnprimes
  (lambda (n nlist slist)
    (if (or (zero? n) (null? nlist))
        slist
        (firstnprimes (- n 1) (listminusnonprimes (car nlist) (car nlist) nlist) (append slist (list (car nlist)))))))


(define listminusnonprimes
     (lambda (num d lst)
       (if (null? lst)
           '()
           (if (< d (car lst))
               (listminusnonprimes num (+ num d) lst)
               (if (= d (car lst))
                   (listminusnonprimes num (+ num d) (cdr lst))
                   (cons (car lst) (listminusnonprimes num (+ num d) (cdr lst))))))))

现在,

代码语言:javascript
复制
(firstnprimes 2 '(2 4 7 9 21 36) '()) => '(2 7)
(firstnprimes 3 '(2 4 7 9 21 36) '()) => '(2 7 9)
(firstnprimes 4 '(2 4 7 9 21 36) '()) => '(2 7 9)

但是第一个元素仍然必须是质数

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11621852

复制
相关文章

相似问题

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