如果递归调用没有 return 方案中的值,如何 return 一个值

How to return a value if recursive calls don't return a value in scheme

我有以下代码来判断一个数是否是质数:

(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 每次都被 returned 而不是 #f,当发现 2 和 n 之间的数字可以被整除时,#f 应该被 returned。

如果找到这样的数字,我如何 return #f 并在找不到这样的数字时绕过我正在尝试 return 的 #t?

平衡括号。 #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 是素数。