[ad_1]
私は再帰法を使って質問をしました
# include <stdio.h> void reverse(char *str) { if (*str) { reverse(str+1); printf("%c", *str); } } int main() { char a[] = "Hello Klu"; reverse(a); return 0; }
私が試したこと:
だから私は再帰法で質問を試みたので、私の質問は彼らが次のような関数を与えるかどうかです
void reverse_string( char *string );
使用するには、再帰メソッドのみを使用する必要がありますか、それとも他の方法はありますか?
解決策 3
文字列の反転は再帰的なアルゴリズムではありません。これは反復的であり、単純なループで処理する必要があります。 そして、あなたの関数は技術的に文字列を逆にするわけではありません – 本当に非効率的な方法で文字列を逆に出力します。
あなたがしなければならないことについて:「ABCDE」を「EDCBA」に変換します
これは、最初と最後の文字を交換し、次に 2 番目と 4 番目の文字を交換することを意味します。文字列の長さが奇数で、中央に 1 つの文字があるため、中央の文字は交換する必要はありません。
だから… 0から(文字列の長さ/ 2 – 1)まで実行されるループを、というインデックスに記述します i
ループを一巡するたびに、 i
文字列の長さの文字で – i + 1
ループの後、すべて交換されます。
文字列を逆に出力する必要がある場合、それはさらに簡単で再帰的ですらありません: 最後の文字から始めて、ループ内で順方向に処理するだけです。
再帰は強力なツールですが、すべてのツールと同様に、どこでも使用するべきではありません! 壁に絵を掛けるのに顕微鏡は使いませんよね? いいえ – 適切なツールであるため、ハンマーを使用します。
解決策 1
見積もり:他の方法はありますか
文字を 1 つずつ新しい配列に最後から最初にコピーできます。 しかし、質問があまり明確ではないことを考えると、おそらくどんな答えでも受け入れられます。
解決策 2
関数
void reverse_string( char *string );
戻り値として void が指定されたため、再帰的な解決策は許可されません。
最善の方法は、文字を前から後ろに交換して、文字列をその場で並べ替えることです。
関数が単一文字の出力も行う場合は、再帰的な解決策を作成することもできます。 ただし、各反復では、文字列全体ではなく、一度に 1 文字のみが出力されます。 多くの不必要な再帰が必要になり、単一文字の出力も非常に遅くなるため、これは非常に非効率的です。
解決策 4
簡単な方法は、インデックス付きの文字と末尾からインデックス付きの文字を差し引いたものを変更しながら、中間の文字にループすることです。 文字列の文字数が不均一な場合に使用します。
[ad_2]
Source link
コメント