在计算音节,句子和单词时,只迭代一个巨大的列表一次

时间:2015-11-08 22:19:52

标签: list recursion scheme

我开始使用一个程序来计算.txt中的句子数,单词数和音节数时遇到了一些麻烦。文件。

基本上,我想只迭代列表一次,在此期间我计算所有内容,然后最后输出所有内容。我不想迭代它三次,每个类别一个(句子,单词,音节)。

我很清楚如何定义我正在寻找的东西。

例如,这是我如何检查音节:

(define (vowel? letter)
  (member? letter '(#\A #\E #\I #\O #\U #\Y #\a #\e #\i #\o #\u #\y)))

(define (punctuation-mark? letter)
  (member? letter '(#\? #\. #\: #\; #\!)))

(define (syllable-start? character)
  (vowel? character))

我想过使用几个与此类似的函数来决定何时开始计数,并使用布尔变量来决定何时停止。我会用syllable-start?看看我是否遇到一个元音,然后我会更新一些布尔值,当我点击不是元音的东西时停止(辅音,标点符号,标记结尾的东西)音节),重新更新布尔值。我会对句子和单词使用相同的方法。

我正在努力解决这个问题。我是计划的新手,我知道如何使用尾递归,但我对此感到不舒服。

我正在将文件转换为字符列表。像这样:

(define (count-everything filename)
  (define textstring(file->string filename))
  (define stringlist(string->list textstring))

我基本上只是对如何编写上述函数感到困惑。如何开始迭代。我希望有人能在我搜索想法时给我一些建议。

1 个答案:

答案 0 :(得分:0)

忘记“更新”和“迭代”,你应该在参数中传递当前状态以进行递归函数调用。

这是一个应该让你开始的例子 - 它计算列表中奇数和偶数整数的数量,结果是一对:

<!-- SAML 2 NameID Generation -->
<util:list id="shibboleth.SAML2NameIDGenerators">

    <ref bean="shibboleth.SAML2TransientGenerator" />

    <!-- Uncommenting this bean requires configuration in saml-nameid.properties. -->
    <!--
    <ref bean="shibboleth.SAML2PersistentGenerator" />
    -->

    <bean parent="shibboleth.SAML2AttributeSourcedGenerator"
        p:format="urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress"
        p:attributeSourceIds="#{ {'email'} }" />

</util:list>

注意两种元素的当前计数如何作为参数传递给递归过程(define (odds-evens ls) (define (count l odds evens) (cond ((null? l) (cons odds evens)) ((odd? (car l)) (count (cdr l) (+ 1 odds) evens)) (#t (count (cdr l) odds (+ 1 evens))))) (count ls 0 0))