递归1--二分查找

一、心得

递归的时候注意返回值,返回的时候是返回到上一层 

 

二、代码及结果



1 /*
2 二分查找:
3 可写递推和递归
4 其实这两个都只要把递推式子写出来就好
5
6 查找的数大于mid,left=mid+1
7 小于mid,right=mid-1
8 边界条件,等于mid,输出即可
9 */
10 /*
11 心得:注意返回值,返回的时候是返回到上一层
12 */
13 #include <iostream>
14 using namespace std;
15 //二分查找递归,设置标签
16 bool binarySearch1(int a[],int left,int right,int num){//初始left=0,right=length-1
17 bool flag=false;
18 int mid=(left+right)/2;
19 //cout<<mid<<endl;
20 //cout<<num<<" "<<a[mid]<<endl;
21 if(left<=right){
22 if(num==a[mid]) {
23 flag=true;
24 }
25 else if(num>a[mid]){
26 //cout<<"right:"<<a[mid+1]<<" "<<a[right]<<endl;
27 flag=binarySearch1(a,mid+1,right,num);
28
29 }
30 else if(num<a[mid]){
31 //cout<<"left:"<<a[left]<<" "<<a[mid-1]<<endl;
32 flag=binarySearch1(a,left,mid-1,num);
33 }
34 }
35 return flag;
36 }
37
38 //二分查找非递归,不设置标签
39 /*
40 不设置返回值的时候,有栈可以存值
41 */
42 bool binarySearch2(int a[],int left,int right,int num){//初始left=0,right=length-1
43
44 int mid=(left+right)/2;
45 //cout<<mid<<endl;
46 //cout<<num<<" "<<a[mid]<<endl;
47 if(left<=right){
48 if(num==a[mid]) {
49 return true;
50 }
51 else if(num>a[mid]){
52 //cout<<"right:"<<a[mid+1]<<" "<<a[right]<<endl;
53 binarySearch2(a,mid+1,right,num);
54
55 }
56 else if(num<a[mid]){
57 //cout<<"left:"<<a[left]<<" "<<a[mid-1]<<endl;
58 binarySearch2(a,left,mid-1,num);
59 }
60 }
61 else{
62 return false;
63 }
64 }
65
66
67 //二分查找递推
68 bool binarySearch3(int a[],int left,int right,int num){//初始left=0,right=length-1
69 while(left<=right){
70 int mid=(left+right)/2;
71 if(num==a[mid]) return true;
72 else if(num>a[mid]) left=mid+1;
73 else if(num<a[mid]) right=mid-1;
74 }
75 return false;
76 }
77
78 int main(){
79 int a[11]={1,2,4,7,8,9,11,15,17,19,20};
80 //bool b=binarySearch1(a,0,10,20);
81 //bool b=binarySearch2(a,0,10,7);
82 bool b=binarySearch3(a,0,10,20);
83 cout<<b<<endl;
84 return 0;
85 }


 递归1--二分查找_微信