我的递归程序有什么问题?

时间:2014-10-15 15:51:08

标签: scheme

此过程接受布尔值列表,如果看到为假,则应终止并返回false。然而,它运行的方式总是如此。

(define L3 (cons true (cons false empty)))

(check-expect (all-true? L3) false)


(define (all-true? lob)
  (cond [(empty? lob) true]
        [else 
         (if (boolean? (first lob))
         (all-true? (rest lob))
         false)]))

我知道我也可以在else语句之后使用AND子句。

1 个答案:

答案 0 :(得分:3)

这应解决问题:

(define (all-true? lob)
  (cond [(empty? lob) true]
        [(first lob) (all-true? (rest lob))]
        [else false]))

说明:

  • 如果我们有几个嵌套条件,只需将它们放在cond内的不同分支中,而不是在if的{​​{1}}部分内写else
  • 我们不想调用cond,用于检查值是否为布尔,而不是用于确定它是否为 true
  • 鉴于该过程收到一个开头的布尔列表,测试第一个元素 true 是否足以继续递归

或者,在Racket中,我们可以使用andmap获得相同的效果:

boolean?

在其他口译员中,我们可以从SRFI-1导入every

(define (all-true? lob)
  (andmap identity lob))