繁体   English   中英

Racket Dr递归计数发生次数

[英]Dr. Racket Recursion count occurrences

我是Racket的新手,正努力学习它。 我正在努力解决一些自己遇到的问题。 这是问题所在:

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

例:

(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-occur ?,该函数接受两个输入,一个atom a和一个list s,并且当且仅当a时输出布尔值true。出现在s中的某个位置,或者作为s中的数据表达式之一,或者作为s中的数据表达式之一的数据表达式之一,或者……,等等。

例:

(atom-occur? 'a '((xy (pq (ab) r)) z)) => #t

(atom-occur? 'm '(x (yp (1 a (b 4)) z))) => #f

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

在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))))))

第二个问题是相似的,但是它使用标准模板遍历列表列表,在这里我们在first输入列表和rest输入列表上进行递归操作,并且仅当我们处于原子状态时才测试是否相等:

(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)))))))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM