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;
}