我正在尝试编写一个函数来计算输入字符串str中不同字符的数量。因此,例如(distinct-char "eeeiicczz")
将返回4.我需要一些帮助我的代码。这就是我所拥有的。
(define string-contains
(lambda (str char)
(if (equal? str "")
#f
(if (char=? (string-ref str 0) char)
#t
(if (not (char=? (string-ref str 0) char))
(string-contains (substring str 1 (string-length str)) char))))))
(define unique-chars
(lambda (str)
(cond
((equal? str "") "")
((equal? (string-length str) 1) (string-ref str 0))
(else
(if (equal? (string-contains (substring str 1 (string-length str)) (string-ref str 0)) #t)
(unique-chars (substring str 1 (string-length str)))
(string-append (substring str 0 1) (substring str 1 (string-length str))))))))
(define distinct-char
(lambda (str)
(string-length (unique-chars str))))
我只能使用这些内置功能:
(if x y z), (cond ...),
(read)
(string-length x)
(string-ref str x)
(substring x y)
(string-append x y)
(equal? x y), (char=?)
(remainder x y), (quotient x y)
(max ...), (min ...)
(+ x y), (- x y), (* x y), (/ x y)
(> x y), (< x y), (<= x y), (>= x y)
(and x y), (or x y), (not x y)
答案 0 :(得分:3)
由于可以将字符串转换为列表,因此使用内置列表函数会更容易。 (注意:下面的代码在Racket中。由于它几乎是Scheme,我假设这些函数存在。如果他们不检查你的文档是否有类似的东西)
(define (distinct-char str)
(length (remove-duplicates (string->list str))))
这是您可以填写的模板。将评论替换为您认为在每种情况下应该发生的事情。祝你好运!
(define (empty-string? str)
( #| What property does an empty string have? Add a simple boolean expression here. |# )
(define (char-exists? str char)
(cond
[(empty-string? str) ( #| If the string is empty, does the character exist? |# )]
[else ( #| Check the first character in the string. If it is what we're looking for
we're done! If it's not call this function on the rest of the string. |# )]))
(define (unique-chars str)
(cond
[(empty-string? str) ( #| What should you return if the string is empty? |# )]
[(equal? (string-length str) 1) ( #| What should you return if the string is one character long? |# )]
[else ( #| If the character at the beginning of the string exists in the rest of the string, ignore it
and preform recursion on the rest of the string. If it doesn't, append the character to
the result of this function on the rest of the string. |# )]))
(define (distinct-char str)
(string-length (unique-chars str)))
答案 1 :(得分:1)
你学习计划的原因之一是它训练你自己构建有用的构建块,然后将这些构建块挂钩在一起。
在这种情况下,我建议的一般方法是编写一个函数:
(string-contains str ch)
返回#t
或#f
,具体取决于str
是否包含字符ch
,然后使用它来定义函数:
(unique-chars str)
返回str
中唯一字符的字符串(您扫描str
,构建答案,并在每个位置查看下一个字符是否已在您正在构建的答案字符串中,如果没有,请将其添加到您的答案字符串中。)
然后,你想要的功能只是
(string-length (unique-chars str))
答案 2 :(得分:0)
您可以保留并传递您之前遇到的每个不同角色的列表。这样,每次检查一个新角色时,都会在列表中查找它,看看你以前是否已经看过它。如果它不在您的列表中,那么它就是一个新角色,您可以将其添加到列表中。
家庭作业问题,所以我不会在答案中编写代码。