【问题标题】: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】:
平衡括号。 #t 在cond 之外;它是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 是素数。