複雑な再帰的アルゴリズムでは、要素値の保存や変更など、関数を再帰的に呼び出すプロセス中に何らかの処理が必要です。文字列の反転、日本語の分解、およびハノイの塔の問題はすべて、複雑な再帰的アルゴリズムです。
文字列
を反転する再帰を使用して文字列を反転し、元の文字列に保存します。
【分析】
文字列が配列sに格納されていると仮定すると、再帰関数のプロトタイプは次のようになります。
int RevStr(char s []、int i);
現在位置の文字を反転するには、反転後に現在の文字列内の格納位置を見つける必要があります。この関数は、最初に現在位置の文字を変数chに読み込みます。現在の位置の文字が終了文字の場合、関数は0を返し、関数への最後の再帰呼び出しで、最後の文字を文字列の最初の位置に格納する必要があることを通知します。コード:
char ch = s [i];
if(ch == '\ 0')
return 0;
その他の場合、関数は文字列sと文字位置i + 1をパラメータとしてRevStrを再帰的に呼び出し、現在の文字の格納位置kを見つけ、その文字を位置kに格納します。同時に次の位置は前の1文字を格納するために使用されます。コード:
k = RevStr(s、i + 1);
s [k] = ch;
k +1を返します。
コード:
#include<stdio.h>
int RevStr(char s[], int i);
void main()
{
char s[] = "Welcome to Northeast University!";
printf("颠倒前:%s\n", s);
RevStr(s, 0);
printf("颠倒后:%s\n", s);
getchar();
}
int RevStr(char s[], int i)
{
int k;
char ch = s[i];
if (ch == '\0')
return 0;
else
{
k = RevStr(s, i + 1);
s[k] = ch;
return k + 1;
}
}
結果: