[英]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.