我是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
任何帮助将不胜感激。谢谢。
答案 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))))))
第二个问题类似,但它使用标准模板遍历列表列表,我们在输入列表的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)))))))