当前位置:   article > 正文

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

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

一、递归案例

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

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

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

二、二分查找案例

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

  1. #include <stdio.h>
  2. int binSearch(int arr[],int len,int target){
  3. //左边界
  4. int left=0;
  5. //len-1,数组长度-1就是数组的最后一项,是右边界
  6. int right=len-1;
  7. //左边必须小于或者等于右边,条件才成立,不然就是超出边界
  8. while(left<=right){
  9. //计算中间位置 mid 来决定下一步搜索哪一半数组。简单的方法可能是直接使用 (left + right) / 2 来计算 mid,
  10. //但这种方法在 left 和 right 都很大时可能导致整数溢出。
  11. //为了避免这种情况,我们使用 left + (right - left) / 2 的公式。
  12. //这个公式首先计算 right 和 left 之间的差值,然后除以 2,最后再加上 left。
  13. //这样,即使 left 和 right 很大,它们的差值也不会太大,从而避免了整数溢出的问题。
  14. int mid=left+(right-left)/2;
  15. // if判断中间值,如果等于目标值,直接返回(return mid)目标值就ok
  16. if(arr[mid]==target){
  17. return mid;
  18. // else if判断中间值是否小于目标值
  19. // 如果 arr[mid] 确实小于 target,说明目标值 target 必然在 mid 的右侧(即数组的后半部分)
  20. // 因为数组是有序的。因此,我们将搜索范围缩小到 mid 的右侧,即更新 left = mid + 1。
  21. }else if(arr[mid]<target){
  22. left=mid+1;
  23. // 如果 arr[mid] > target,则目标值 target 必然在 mid 的左侧(即数组的前半部分),
  24. // 因为数组是有序的。因此,我们将搜索范围缩小到 mid 的左侧,即更新 right = mid - 1。
  25. }else{
  26. right=mid-1;
  27. }
  28. }
  29. return -1;
  30. }
  31. int main() {
  32. int arr[]={1,3,6,12,45,67,89,93,96};
  33. int len=sizeof(arr)/sizeof(arr[0]);
  34. int target=12;
  35. int index=
  36. return 0;
  37. }

三、冒泡排序

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

  1. #include <stdio.h>
  2. int main() {
  3. int arr[]={1,34,56,78,54,32,12,2,7};
  4. int len=sizeof(arr)/sizeof(arr[0]);
  5. //外层循环控制排序的次数(五个数字排序就是对比四次,所以要len-1)
  6. for(int i=0;i<len-1;i++){
  7. //内层循环控制循环趟数(每次循环一次就排除一个数字和下标,所以是len-i-1)
  8. for(int j=0;j<len-i-1;j++){
  9. if(arr[j]>arr[j+1]){
  10. int temp=arr[j];
  11. arr[j]=arr[j+1];
  12. arr[j+1]=temp;
  13. }
  14. }
  15. };
  16. for(int i=0;i<len-1;i++){
  17. printf("%d\n",arr[i]);
  18. }
  19. return 0;
  20. }
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/490327
推荐阅读
相关标签
  

闽ICP备14008679号