C言語学習のまとめ_04

1.前回の記事では、再帰を使用してn番目のフィボナッチ数を見つけると、実際には効率が非常に低くなります。以下に示すように、多くの繰り返し計算があるため:
ここに画像の説明を挿入
6桁目を見つけると、多くの繰り返し計算が実行されます。

int count = 0;
//用递归求第n个斐波那契数字
int Fib(int n){
    
    
	if (1 == n || 2 == n){
    
    
		return 1;
	}
	if (n == 3){
    
    
		count++;
	}
	return Fib(n - 1) + Fib(n - 2);
}
int main(){
    
    
	int ret= Fib(40);
	printf("%d\n", ret);
	printf("调用Fib(3) %d 次\n", count);
	system("pause");
	return 0;
}

ここに画像の説明を挿入
Fib(40)を計算するだけで、Fib(3)が何度も計算されるのに、なぜ呼び出しの数がそれほど非効率なのですか?呼び出し関数はコストがかかるため、スタックフレームは常に形成および解放され、時間と空間に反映されます。では、どうすれば改善できるでしょうか。反復法を使用して、再帰を非再帰に変更できます。

int fib_1(int n)
{
    
    
	int first = 1;
	int second = 1;
	int third = 1;
	while (n>2){
    
    
		third = first + second;
		first = second;
		second = third;
		n--;
	}
	return third;
}
int main(){
    
    

	int ret = fib_1(40);
	printf("%d\n", ret);
	

	system("pause");
	return 0;
}

この反復法の結果は秒です。
2.
1.配列
使用時の配列に関する注意事項
1)int arr [25];
配列作成するには、[]に定数を指定する必要があり、変数は使用できません。
2)配列は全体として初期化できますが、全体として割り当てることはできません
。3)メモリ内の配列のストレージ。メモリ内の
配列スペースは全体として開かれ、解放されます。配列は次のように見なされる必要があります。全体。添え字はゼロから始まり、アドレスは低から始まります。高まで、メモリアドレス指定の基本単位はバイトです。配列はメモリに継続的に格納する必要があります(線形ストレージ)。アドレスを確認するためにコードを記述します。要素内の配列の:

int main(){
    
    
	int arr[10] = {
    
     0 };
	int arrsize = sizeof(arr) / sizeof(arr[0]);//此时数组名,sizeof(arr)单独使用 \
	代表的是整个数组
	for (int i = 0; i < arrsize; i++){
    
    
		printf("&arr[%d] = %p\n", i, &arr[i]);
	}
	system("pause");
	return 0;
}

ここに画像の説明を挿入
各int型のサイズは4バイトであるため、配列要素のアドレスは高から低で連続していることがわかります。
2. 2次元配列への拡張2
次元配列は1次元配列と見なすことができますが、配列に格納される要素は1次元配列であり、3次元および4次元配列についても同じことが言えます。例として、配列に格納されている数値は、たとえばint型です。これは配列型のみであり、将来的には構造型、クラスなどで構成されます。
注:2次元または多次元配列を初期化する場合、最初の次元の長さのみを省略できます。
3.関数のパラメーターとしての
配列配列が関数のパラメーターとして渡されると、次元削減が発生し、次元がその内部要素へのポインターに削減されます。配列がパラメーターとして渡されると、長さ配列のも渡される必要があります。
順序付けされていない配列内の要素のインデックスを検索する
ステップ1:最初に配列を並べ替える
ステップ2:配列バイナリのインデックスを検索する
コードは次のとおりです。

//打印数组元素
void PrintArr(int arr[], int arrsize){
    
    
	for (int i = 0; i < arrsize; i++){
    
    
		printf("%d\n", *(arr + i));
		//printf("%d\n", arr[i]);
	}
}
//冒泡排序
void BubbleSort(int arr[], int arrsize){
    
    
	int flag = 0;
	for (int i = 0; i < arrsize-1; i++){
    
    
		for (int j = 0; j < arrsize - 1 - i; j++){
    
    
			if (arr[j]>arr[j + 1]){
    
    
				int temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;
				flag = 1;
			}
		}
		if (flag){
    
    
			break;
		}
	}
}
//二分查找
int BinSearch(int arr[], int arrsize, int num){
    
    
	int left = 0;
	int right = arrsize - 1;//[]
	int mid = 0;
	while (left <= right){
    
    
		mid = left + (right - left) / 2;//避免溢出
		if (num > arr[mid]){
    
    
			left = mid + 1;
		}
		else if (num <arr[mid]){
    
    
			right = mid - 1;
		}
		else{
    
    
			return mid;
		}
	}
	if (left > right){
    
    
		printf("没有这个元素~~\n");
	}

}
int main(){
    
    
	int arr[] = {
    
     0,1,2,3,4,99,66,77,88,111,222,555,666 };
	int arrsize = sizeof(arr) / sizeof(arr[0]);

	printf("排序前:\n");

	PrintArr(arr, arrsize);

	BubbleSort(arr, arrsize);

	printf("排序后:\n");

	PrintArr(arr, arrsize);

	int index  = BinSearch(arr, arrsize, 66);
	printf("要查找元素的下标为 %d:\n", index);

	system("pause");
	return 0;
}

おすすめ

転載: blog.csdn.net/CZHLNN/article/details/109270265