C语言例题(递归、二分查找、冒泡排序)

发布于:2024-04-30 ⋅ 阅读:(31) ⋅ 点赞:(0)

一、递归案例

有5个人坐在在一起,问第5个人多少岁?他说比第4个人大两岁。问第4个人岁数,他说比第3个人大两岁。问第3个人,又说比第2个人大两岁。问第2个人,说比第1个人大2岁。最后问第1个人,他说是10岁。请问第5个人多大?

请使用递归完成以上问题的求解。

#include <stdio.h>
int getAge(int n){
   //如果n等于1,函数返回10。这表示第一个人(或者当n为1时)的年龄是10岁。
   if(n==1){
     return 10;
   }else{
    //(n-1)+2意思是,要想知道当前考虑的人n的年龄,就要先找到他前一个人(n-1)的年龄的基础上加2岁
     return getAge(n-1)+2;                 
   }
}
int main() {
// 基础条件:第一个人是10岁
// 递归条件:(n-1)+2
int res=getAge(5);
printf("%d",res);
 return 0;
}

二、二分查找案例

给定数组{1,3,6,12,45,67,89,93,96},使用二分查找求93的下标并输出。

#include <stdio.h>
int binSearch(int arr[],int len,int target){
    //左边界
    int left=0;

    //len-1,数组长度-1就是数组的最后一项,是右边界
    int right=len-1;

    //左边必须小于或者等于右边,条件才成立,不然就是超出边界
    while(left<=right){

    //计算中间位置 mid 来决定下一步搜索哪一半数组。简单的方法可能是直接使用 (left + right) / 2 来计算 mid,
    //但这种方法在 left 和 right 都很大时可能导致整数溢出。
    //为了避免这种情况,我们使用 left + (right - left) / 2 的公式。
    //这个公式首先计算 right 和 left 之间的差值,然后除以 2,最后再加上 left。
    //这样,即使 left 和 right 很大,它们的差值也不会太大,从而避免了整数溢出的问题。
    int mid=left+(right-left)/2;

    // if判断中间值,如果等于目标值,直接返回(return mid)目标值就ok
    if(arr[mid]==target){
        return mid;

    // else if判断中间值是否小于目标值
    // 如果 arr[mid] 确实小于 target,说明目标值 target 必然在 mid 的右侧(即数组的后半部分)
    // 因为数组是有序的。因此,我们将搜索范围缩小到 mid 的右侧,即更新 left = mid + 1。
    }else if(arr[mid]<target){
      left=mid+1;

    // 如果 arr[mid] > target,则目标值 target 必然在 mid 的左侧(即数组的前半部分),
    // 因为数组是有序的。因此,我们将搜索范围缩小到 mid 的左侧,即更新 right = mid - 1。
    }else{
      right=mid-1;
      }
   }
    return -1;
}
int main() {
 int arr[]={1,3,6,12,45,67,89,93,96};
 int len=sizeof(arr)/sizeof(arr[0]);
 int target=12;
 int index=

 return 0;
}

三、冒泡排序

给定数组{3,93,67,96,45,6,89,93,12},对数组进行排序并输出。

#include <stdio.h>

int main() {
 int arr[]={1,34,56,78,54,32,12,2,7};
 int len=sizeof(arr)/sizeof(arr[0]);
//外层循环控制排序的次数(五个数字排序就是对比四次,所以要len-1)
 for(int i=0;i<len-1;i++){
//内层循环控制循环趟数(每次循环一次就排除一个数字和下标,所以是len-i-1)
    for(int j=0;j<len-i-1;j++){
        if(arr[j]>arr[j+1]){
            int temp=arr[j];
            arr[j]=arr[j+1];
            arr[j+1]=temp;
        }
    }
 };
for(int i=0;i<len-1;i++){
    printf("%d\n",arr[i]);
}

 return 0;
}