配列の非再帰と再帰について話す

配列の非再帰と再帰について話す

非再帰的

#define N 10
#include <stdio.h>

void ReverseArr(int* a, int n)
{
	for (int i = 0; i <= n / 2; i++)
	{
		int tmp;
		tmp = a[i];
		a[i] = a[n - i - 1];
		a[n - i - 1] = tmp;
	}
}

int main()
{
	int arr[N] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
	ReverseArr(arr, N);
	for (int i = 0; i < N; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

  配列の初期化では配列のサイズを指定する必要があり、変数として書き込むことはできません。したがって、ここではマクロを使用して定義します。次に、交換する必要がある場合は、forループを使用して最初の値を交換するだけで済みます。配列の最後の値。非再帰形式は比較的単純なので、ここではあまり説明しません。

出力を再帰的に印刷します

#include <stdio.h>

void reverse_string(char* string)
{
	if (*string != 0)
	{
		reverse_string(string + 1);
	}
	//减去\0
	string--;
	printf("%c", *string);
}

int main()
{
	char arr[] = "student";
	int n;
	reverse_string(arr);

	return 0;
}

  この部分では、再帰メソッドを使用して最後の配列の要素を見つけて直接出力します。ここでは、配列を逆の順序で出力しますが、実際には配列の要素の順序は変更されません。ロジックは比較的単純ですが、実際にはお勧めしません。実際の開発プロセスでは、関数呼び出しは通常、戻り値を変更または取得し、その後、戻り値がメイン関数で判断されるか、値が直接であるためです。変更後、変更後の値は次のようになります。別の関数の値になって呼び出される場合があります。したがって、逆順での印刷のみの場合は使用できます。それ以外の場合はお勧めしません。再帰性を高めるために方法については、次の方法を参照してください。

配列を逆の順序で再帰的に格納し、出力します

#include <stdio.h>
#include <string.h>

int my_string(char* a)
{
	if (*a == '\0')
	{
		return 0;
	}
	else
	{
		return 1 + my_string(a + 1);
	}
}

void ReverseOrder(char a[])
{
	char temp = a[0];
	int n = my_string(a);
	a[0] = a[n - 1];
	a[n - 1] = '\0';
	int m = my_string(a + 1);
	if (m > 1)
	{
		my_string(a + 1);
	}
	a[n - 1] = temp;
}

int main()
{
	char arr[10] = { 0 };
	scanf("%s", arr);
	ReverseOrder(arr);
	printf("%s", arr);

	return 0;
}

この方法は、以前の方法に比べて大幅に改善されています。再帰的な方法を使用して、元の配列の配列の順序を直接変更し、保存します。これは、逆の順序を使用する場合のmain関数にあります。後者の配列も可能ですが、これは一度限りの方法ですが、配列の再帰的な方法は非再帰的な方法よりも論理的に複雑です。したがって、実際の状況では、非再帰的であるが再帰的な方法を使用することをお勧めします。メソッドも習得する必要があります。インタビューに表示される場合もあります(必須ではありませんが、記述できる必要があります)。サマリーコードの書き方は次のとおりです:

1.最初の文字を保存します
2.最初の文字を
最後の文字に置き換えます3.最後の文字は\ 0になります
4.再帰呼び出し
  4.1条件を決定します
  4.2パラメータを渡すことは、現在の文字列の2番目の文字で始まる文字列を渡すことです
5.最初の文字を下にして保存し、現在の最後の文字を置き換えます

おすすめ

転載: blog.csdn.net/weixin_43580319/article/details/111462130