Dr. Racket递归计数发生

时间:2014-11-14 18:53:27

标签: recursion racket

我是Racket的新手,并试图学习它。我正在解决一些我正在努力解决的问题。以下是问题所在:

编写递归函数的定义,该函数采用数据表达式a和列表s,并返回数据表达式a出现在列表中的次数。

示例:

(occur '() '(1 () 2 () () 3)) => 3

(occur 1 '(1 2 1 ((3 1)) 4 1)) => 3(注意它只查看列表中的整个元素)

(occur '((2)) '(1 ((2)) 3)) => 1

这是我到目前为止所写的:

 (define occur
      (lambda (a s)
        (cond
          ((equal? a (first s))
          (else (occur a(rest s))))))

我不确定如何实施计数。下一个问题是类似的,我不知道如何处理。这是问题所在:

(这与上面的函数类似,但它也在子列表中查找)写一个递归函数atom-occurrence?,它接受两个输入,一个原子a和一个列表s,并输出布尔值true和if只有当a出现在s中的某个位置时,或者作为s中的一个数据表达式,或者作为s中的数据表达式中的一个数据表达式,或者......,等等。

示例:

(atom-occur? 'a '((x y (p q (a b) r)) z)) => #T

(atom-occur? 'm '(x (y p (1 a (b 4)) z))) => #F

任何帮助将不胜感激。谢谢。

1 个答案:

答案 0 :(得分:1)

在Racket中,解决此问题的标准方法是使用内置程序:

(define occur
  (lambda (a s)
    (count (curry equal? a) s)))

但是,当然,你想从头开始实现它。不要忘记基本情况(空列表),并记住在找到新匹配时添加一个单位。试试这个:

(define occur
  (lambda (a s)
    (cond
      ((empty? s) 0)
      ((equal? a (first s))
       (add1 (occur a (rest s))))
      (else  (occur a (rest s))))))

第二个问题类似,但它使用标准模板遍历列表列表,我们在输入列表的firstrest上进行递归,并且当我们在原子中时,只测试相等性:

(define atom-occur?
  (lambda (a s)
    (cond
      ((empty? s) #f)
      ((not (pair? s))
       (equal? a s))
      (else (or (atom-occur? a (first s))
                (atom-occur? a (rest s)))))))