1

CodeLab for C++ を使用してオンライン作業を行っていますが、コードの何が問題なのかわかりません。質問は次のとおりです。

文字列を受け取り、文字列内の文字数を返す再帰的な int 値関数 len を作成します。文字列の長さ: 文字列が空の文字列 ("") の場合は 0。最初の文字を超える文字列の残りの長さよりも 1 長い。

そして、ここに私のコードがあります:

int len(string s)
{
  if (s.length()==0)
    return 0;
 else
 {
    return 1+(len(s)-1);
 }
}

実行時エラーが発生したと表示されます。何か助けはありますか?

ありがとう。

4

4 に答える 4

11

さてここに:

     return 1+(len(s)-1);

弦の長さが減ることはありません。したがって、基本ケースに到達しないため、最終的にスタックオーバーフローが発生します。s(s.length() == 0).の長さが 1 減少する部分文字列を取得する必要があります。

     return 1+(len(s.erase(0,1))); // erases 1 char from beginning then recurses

一定時間で実行されるメソッドがstd::stringあるため、これが純粋に学術的なものであることを願っています。length(文字列の前から消去することはおそらく恐ろしく非効率的であることは言うまでもありません - で動作する他の回答を参照してくださいchar *

于 2012-12-07T21:55:25.887 に答える
3

len(s) が減少してスタックオーバーフローが発生することはありません。私は次のようなことをします:

int len(const char * s) {
    if(*s == '\0')
        return 0;
    else
        return 1 + len(s+1); 
}
于 2012-12-07T21:59:13.830 に答える
3

sコードを変更することはないため、sが空でない場合は、同じパラメーターを使用して同じ関数を繰り返し呼び出します。あなたは決して止まらない。コンピューターのスタック領域が不足し、プログラムがクラッシュします。

他の人がいくつかのアイデア/オプションを提供してくれました。これが私の提案です:

int len(const std::string &s, int start)
{
    /* If we are starting at the end, there's no more length */
    if(start == s.length())
        return 0;

    /* one plus whatever else... */
    return 1 + len(s, start + 1);
}

str長さを取得したい文字列が であると仮定すると、次のように呼び出すことができます。len(str, 0)

const char *バージョンを使用する必要がある場合は、これを試してください:

int len(const char *s)
{
    if((s == NULL) || (*s == 0))
        return 0; /* we ran out of string! */

    return 1 + len(s + 1);
}
于 2012-12-07T22:04:12.517 に答える
0

別の解決策:

int len(string s)
  {
  if (s.length()==0)
      return 0;
  else
     {
     s = s.substr(0, s.size()-1);
     return 1+(len(s));
     }
  }
于 2012-12-07T22:18:17.950 に答える