Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 使用递归在字符串开头查找单词的长度_C_Recursion - Fatal编程技术网

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

C 使用递归在字符串开头查找单词的长度,c,recursion,C,Recursion,我编写了下面的代码,用递归计算字符串开头的单词长度。我曾经想到过一种情况,在这种情况下,我的代码无法工作“#@*hello”我需要如何修改代码来解决这个问题(正确答案是5)?谢谢 有点不清楚为什么要在函数语言之外使用递归来解决这个问题。坦率地说,这也有点不清楚问题的实际参数是什么 如果您的实际意图是测量字符串中第一个单词的长度(定义为如果传递给Isleter,则返回True结果的字符序列),即使该单词不是从字符串的开头开始,那么最简单的,最清晰的解决方案似乎是:让函数使用一个名为letterSe

我编写了下面的代码,用递归计算字符串开头的单词长度。我曾经想到过一种情况,在这种情况下,我的代码无法工作“#@*hello”我需要如何修改代码来解决这个问题(正确答案是5)?谢谢


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

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

  • 如果函数读取非字母字符,且
    letterSeenYet
    标志为
    False
    ,则将
    length
    设置为0+递归函数调用的结果,并确保该调用的标志设置为
    False
  • 如果函数读取字母字符,请将
    length
    设置为1+递归函数调用的结果,并确保该调用的标志设置为
    True
  • 如果函数读取非字母字符,且
    letterSeenYet
    标志为
    True
    ,则返回0
我希望您能理解其中的逻辑:您希望非字母字符的意思是“停止计数字母”,但只有在您看到一些字母开始之后


同样,我真的不明白为什么要用递归来解决这个问题。有一些问题以递归的形式更容易理解,但这个问题似乎更容易(也更有效)以迭代的方式处理。(另外,正如Charles Salvia指出的,您不仅应该为第一个单词的结尾做好准备,还应该为字符串的可能结尾做好准备。)

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

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

  • 如果函数读取非字母字符,且
    letterSeenYet
    标志为
    False
    ,则将
    length
    设置为0+递归函数调用的结果,并确保该调用的标志设置为
    False
  • 如果函数读取字母字符,请将
    length
    设置为1+递归函数调用的结果,并确保该调用的标志设置为
    True
  • 如果函数读取非字母字符,且
    letterSeenYet
    标志为
    True
    ,则返回0
我希望您能理解其中的逻辑:您希望非字母字符的意思是“停止计数字母”,但只有在您看到一些字母开始之后


同样,我真的不明白为什么要用递归来解决这个问题。有一些问题以递归的形式更容易理解,但这个问题似乎更容易(也更有效)以迭代的方式处理。(此外,正如Charles Salvia指出的,您不仅应该为第一个单词的结尾做好准备,还应该为字符串的可能结尾做好准备。)

从递归的角度思考可能有点棘手。不必详细说明为什么或者为什么不使用递归,让我们假设它必须是递归(家庭作业、发现,不管是什么原因)

<> P>递归的主要考虑是<强>终止条件< /强>是什么。如果这样做有困难,也许以迭代的方式编写算法可以帮助您

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

简单的递归算法可能是:

  • 检查当前字符。是“\0”吗?
    • 是:返回0
    • 否。当前字符是字母吗?
      • 是:返回1+使用递增字符指针调用此函数
      • 否:返回0+使用递增字符指针调用此函数
请注意,该算法不会在看到非字母字符后终止,因此“测试a”将返回5,而不是4。如果必须在之前终止,则需要某种类型的标志传递给函数


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

从递归的角度思考可能有点棘手。不必详细说明为什么或者为什么不使用递归,让我们假设它必须是递归(家庭作业、发现,不管是什么原因)

<> P>递归的主要考虑是<强>终止条件< /强>是什么。如果这样做有困难,也许以迭代的方式编写算法可以帮助您

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

简单的递归算法可能是:

  • 检查当前字符。是“\0”吗?
    • 是:返回0
    • 否。当前字符是字母吗?
      • 是:返回1+调用此函数
           int startWordLenRec(char s[]) {
                int length;
                if (isLetter(s[0]) == false){
                    return 0;
                }
                else{
                    length = 1 + startWordLenRec(s+1);
                }
                return length;
            }