使用递归查找字符串开头的单词长度

时间:2009-11-15 16:05:18

标签: c recursion

我编写了下面的代码,用递归计算字符串开头的单词长度。我想过一个案例,我的代码不能正常工作“#@ * hello”我需要修改代码来解决这个问题(正确的答案是5)?感谢

   int startWordLenRec(char s[]) {
        int length;
        if (isLetter(s[0]) == false){
            return 0;
        }
        else{
            length = 1 + startWordLenRec(s+1);
        }
        return length;
    }

2 个答案:

答案 0 :(得分:3)

为什么你在函数式语言之外使用递归来解决这个问题有点不清楚。坦率地说,还有点不清楚问题的实际参数是什么。

如果您的实际意图是测量字符串中第一个字的长度(如果传递给True,则定义为返回isLetter结果的字符序列)即使该单词不是从字符串的开头开始,那么最简单,最清晰的解决方案似乎是:使该函数将一个标志作为参数,称为letterSeenYet。在对函数的初始调用中,标志应设置为False

  • 如果函数读取非字母字符,且letterSeenYet标志为False,则将length设置为等于0 +递归函数调用的结果,并确保该呼叫的标志设置为False
  • 如果函数读取字母字符,请将length设置为等于1 +递归函数调用的结果,并确保该调用的标志设置为True
  • 如果函数读取非字母字符,letterSeenYet标志为True,则返回0.

我希望你看到这样的逻辑:你想要一个非字母字符表示“停止计算字母”,但是在你看到一些字母开头之后只需要

同样,我真的不明白你为什么要使用递归来解决这个问题。有一些问题在递归形式中更容易理解,但是这个问题似乎远比这更容易(也更有效)迭代处理。 (另外,正如查尔斯·萨尔维亚所指出的那样,你应该准备好不只是为了第一个单词的结尾,而是为了字符串的可能结尾。)

答案 1 :(得分:0)

在递归方面的思考可能有点棘手。没有详细说明为什么或为什么不使用递归,我们假设它必须是递归(家庭作业,发现,无论什么原因)。

因此,递归考虑的主要问题是终止条件。如果您在执行此操作时遇到问题,也许以迭代方式编写算法可以帮助您。

在这种情况下,您需要确定的是字符数组何时结束。如果当前字符为'\0',则会出现这种情况。

一个简单的递归算法可能是:

  • 检查当前字符。是'0'?
    • 是:返回0
    • 否。当前字符是一个字母吗?
      • 是:返回1 +使用递增的字符指针调用此函数
      • 否:返回0 +使用递增的字符指针调用此函数

请注意,此算法在看到非字母字符后不会终止,因此“test a”将返回5,而不是4.如果必须先终止,则需要某种类型的标志,并将其传递给功能

无论如何,我的主要观点是想到终止条件应该是什么。