【问题标题】:How do I make a recursive string detector in c++ using only 2 parameters如何仅使用 2 个参数在 C++ 中制作递归字符串检测器
【发布时间】:2021-05-29 05:49:21
【问题描述】:
int charFrequency( string str, char c,int subscript) {  
  
  if (subscript >= str.length())
  {
    return 0; 
  }
  else if (str[subscript] == c)

  {
    
    return 1 + charFrequency(str, c, subscript+ 1);

  }
  else
  {
    return charFrequency(str, c, subscript+ 1);
  }
}

这是我的递归函数,它没有任何问题,但是我必须修改它以使其仅使用两个参数字符串和字符 c 我不能在函数中有额外的下标参数,但我可以弄清楚如何使它工作,我想我精神受阻,无法这样做。任何帮助将不胜感激。

【问题讨论】:

  • 代码应该做什么?请出示minimal reproducible example
  • 递归做某事的典型方法是让递归案例做一些“更小”的事情。然后,最终,“更小”的东西变得一无所有,你就完成了。你可以这样想,或者你可以“颠倒”地想它:什么是最小的情况:无事可做。 next-to 最小的情况是什么?如何一步一步从那里得到最小的情况?
  • 对不起,我应该澄清一下,但基本上它接受任何字符串以及任何字符,然后它将输出该字符在该字符串中出现的次数,例如 CharFrequency("aaaa",a ) 输出为 4
  • string str 按值传递。您可以每次都使字符串稍微小一些,而不是对其进行迭代。注意:这是对递归的非常糟糕的使用。我假设这是一项任务,你别无选择,但是当你开始实际编程时,不要对自己这样做。
  • @Nicholas “我应该澄清一下” -- 你使用过去时好像这是你无法改变的。想想现在时:你应该澄清(通过使用“编辑”链接将该信息添加到你的问题中)。

标签: c++ string recursion


【解决方案1】:

我认为你的意思是这样的:

#include <iostream>

using namespace std;

int charFreq(const char * str, char c) {
  if (str[0] == '\0') {
    return 0; 
    
  } else if (str[0] == c) {
    return 1 + charFreq(str + 1, c);

  } else {
    return charFreq(str + 1, c);
  }
}

int main()
{
    string smt = "Hello World";
    
    cout << "freq: " << charFreq(smt.c_str(), 'l') << "\n";

    return 0;
}

使用 str + 1,您可以在 char 数组中移动指针,该数组可从 std::string 槽 .c_str() 访问。请注意作为 c 样式字符串的标准部分的结尾 '\0' 字符。但是如果你提供一些常规的 char 数组,可能会导致无限循环或程序崩溃。

用字符串更新版本:

int charFreq(string str, char c) {
  if (str.length() == 0) {
    return 0; 
    
  } else if (str[0] == c) {
    return 1 + charFreq(str.substr(1), c);

  } else {
    return charFreq(str.substr(1), c);
  }
}

【讨论】:

  • 感谢您的回复,但是我面临的问题与我上传的代码类似,我无法更改我的参数我需要将我的 str 变量保留为字符串和我的 c 变量作为字符。我很抱歉没有提到这一点
猜你喜欢
  • 2015-03-21
  • 2021-12-10
  • 2016-01-25
  • 1970-01-01
  • 2014-01-29
  • 2015-10-19
  • 2013-03-20
  • 2020-06-28
  • 2014-01-01
相关资源
最近更新 更多