【问题标题】:How to return a value if recursive calls don't return a value in scheme如果递归调用未在方案中返回值,如何返回值
【发布时间】:2018-10-26 11:35:33
【问题描述】:

我有以下代码来确定一个数字是否为质数:

(define (recIsPrime num n)
    (display num)(display (- n 1))(newline)
    (cond ((= (remainder num (- n 1)) 0) #f)
        (else (if (> n 3)
            (recIsPrime num (- n 1)))))
    #t
    )

第一次通话时号码相同。我遇到的问题是每次都返回#t,而不是当发现2到n之间的数字可以被整除时应该返回的#f。

如何在找到这样的数字时返回 #f 并在找不到这样的数字时绕过我试图返回的 #t?

【问题讨论】:

    标签: recursion scheme primes


    【解决方案1】:

    平衡括号。 #tcond 之外;它是recIsPrime 中的最后一个表达式,所以它总是作为它的值返回。

    只要把它放在cond的分支里,像这样:

    (define (recIsPrime num n)
        (cond 
          ( (= (remainder num (- n 1)) 
               0)
              #f )
          (else 
              (if (> n 3)
                (recIsPrime num (- n 1))
                #t
                ))))
    

    cond 中包含if 是多余的;最好将它们融合为一个 cond 并使用三种替代方案:

    (define (recIsPrime num n)
        (cond 
          ( (= (remainder num (- n 1)) 
               0)
              #f )
          ((> n 3)
              (recIsPrime num (- n 1)))
          (else
              #t )))
    

    或者使用逻辑连接词,如

    (define (recIsPrime num n)
        (and (not (= (remainder num (- n 1)) 
                     0))
              (or (<= n 3)
                  (recIsPrime num (- n 1)))))
    

    看起来您打算将其称为(recIsPrime num num) 并让它按降序尝试数字。不。与较大的除数相比,数字更可能具有较小的除数。

    另外,2 是素数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-27
      • 2022-11-21
      • 1970-01-01
      • 2021-03-14
      • 1970-01-01
      • 2015-06-30
      相关资源
      最近更新 更多