二分查找(Binary Search)通过不断缩小查找区间,在有序数组中高效定位目标值;汉诺塔(Tower of Hanoi)则借助辅助杆,将圆盘按规则从源杆移动到目标杆。两者都体现了分治思想:二分查找每次将问题规模减半,汉诺塔则将 n 个圆盘的问题拆解为 n-1 个圆盘的子问题。
下面以有序数组 [1, 3, 5, 7, 9] 查找目标值 7 为例,演示二分查找过程中 left、right、mid 指针的移动:
逐步说明:
- 第 1 步:
left = 0,right = 4,mid = (0+4)/2 = 2。此时arr[2] = 5,因为5 < 7,说明目标值在右半区,所以将left更新为mid + 1 = 3。 - 第 2 步:
left = 3,right = 4,mid = (3+4)/2 = 3。此时arr[3] = 7,恰好等于目标值,查找成功,返回下标3。
整个过程中,查找区间从 [0, 4] 缩小到 [3, 4],最终定位到目标值,体现了二分查找每次将问题规模减半的特点。
模型:类似一维数组的表格,上层是数据,下层是下标。最左边,最右边,中间:left right middle
和数学的那个比大小有点像,通过放缩不断缩小比较范围
运用函数 left right middle target return -1
#include<stdio.h>
int binarysearch(int arr[],int left ,int right,int taeget);
{if (left>right)
return -1;
int mid=left+(right-left)/2;
if (arr[mid]=target)
return mid;
else if(arrr(mid)<target)
return binarysearch(arr,left,mid+1,target);
else
return binarysearch(arr,right,mid-1,target);
}
注意:定义函数和调用不一样
定义时要把全部信息写完整,但调用时只写参数
定义时原位置只是放了个盒子,不是说它就是那个含义,只是说那里可以放两个参数left也可以是mid
汉若塔问题(公式:2的n次方-1)
1.一次转一个
2.大的在下面
3.顺序从上往下,因此这就导致了多杆问题
公式:hanoi(n,源,辅助,目标);
例题:
#include(stdio.h)
void hanor(n,char post1,post2,post3)
{ if(n==0)
return 0;
hanor(n-1,post1,post3,post2);
printf(“%C->%C\n”,post1,post3);
hanor(n-1,post2,post1,post3);
}
}
它一定告诉你有多少片要移动的
总结
二分查找和汉诺塔虽然解决的问题不同,但都基于分治思想:
- 共同点:两者都将大问题拆解为规模更小的子问题。二分查找每次将查找区间缩小一半;汉诺塔将 n 个圆盘的问题转化为 n-1 个圆盘的移动问题。
- 不同点:
- 用途不同:二分查找用于在有序数组中查找目标值;汉诺塔用于按规则移动圆盘。
- 结果不同:二分查找返回目标值的下标或 -1;汉诺塔输出一系列移动步骤。
- 递归方式不同:二分查找是单路递归(每次只进入一个分支);汉诺塔是双路递归(每次递归调用两次自身)。
365



被折叠的 条评论
为什么被折叠?



