1

だから私はこれを行う方法を理解しようとしています:

C 文字列内のすべての文字を合計する再帰関数を作成します。

私はこれを通常どおり行うのに少し慣れていませんが、最終的には通常の for ループで動作するようになりました:

int countstr(string s)
{ 
int sum = 0;

  if(s.length() == 0)
    {
    exit(0);
    }
  for (unsigned int i = 0; i < s.size(); i++) 
     {
         sum += s[i];
         }
 return sum;

}

その後、メインの内部に移動して、次のことを行うことができます。

int main ()
{
  cout << "This word adds up to " << countstr("HELLO") << " in ASCII " << endl;
}

すべてが正常に機能し、ASCII 番号を使用して文字列内の文字をカウントおよび加算します。私が抱えている問題は、これがどのようにタイプアップされているかを理解しようとしているため、再帰的に機能します。関数自体を呼び出す代わりに for ループを使用する必要があることはわかっていますが、sum += s[i]; の代わりに何を使用すればよいかわかりません。forループに入っていること。C 文字列ライブラリを調べてみましたが、for ループが呼び出す [i] を置き換えるものは見当たりません。これを行うために何を使用すべきか誰かが知っていますか? 私はコードで答えを探しているのではなく、これを実現するために何を使用すべきかについて助けが必要です。

4

3 に答える 3

3

これは、多くの方法の 1 つです。

int reccountstr(string s, int i){
  if(s.size() == i)
    return (0 + s[i]);
  else
    return reccountstr(s, i + 1) + s[i];
}

そして main では、初期引数ゼロで呼び出すだけです。

cout << "This word adds up to " << reccountstr("HELLO", 0) << " in ASCII " << endl;
于 2013-04-09T04:41:51.900 に答える
1
int countString(char sample[], int i)
{
    if(sample[i] == 0)
        return 0;
    else
        return(1 + countString(sample, i+1));
}

これは、現在読み取られている文字が null (0 または '\0') でない場合に、読み取られる現在の文字インデックスが1 + countString(sample, i + 1)どこにあるかを返す 1 つの解決策になる可能性があります。i

null に達すると、0 を返します。つまり、文字長が 3 の場合、1 + 1 + 1 + 0 を実行します。この関数は で呼び出すことができますprintf("%d\n", countString(yourStringName, 0))

  1. したがって、ここでの基本ケースはcharacter[index] == empty

  2. あなたの帰納的な場合は1 + function(stringName, index + 1)、大まかに言えば です。

また、これは質問の範囲外ですが、スタックを常に構築することを避けることで、これをより効率的にすることもできます。これを行う方法は、合計カウントを継続的に累積する別の変数を関数内に作成することです。詳細については、tail recursion: http://c2.com/cgi/wiki?TailRecursionのこのリンクを参照してください。


よりメモリの保守的なバージョン:

int countString(char sample[], int i, int total)
{
    if(sample[i] == 0)
        return total;
    else
        return countString(sample, i+1, ++total);
}

これを呼び出すことができますprintf("%d\n", countString(sample, 0, 0));

于 2013-04-09T04:40:36.873 に答える