二分法

题目:有一重量分析仪器要求最少步骤分出最重和最轻物品。

也就是找最大最小数的

void divi(int arr[],int i,int j,int *max,int *min)
{
  int lmax,lmin,rmax,rmin;    /*下面有设置4个变量的思路,如何设计要几个辅助变量?*/
  if(i == j){
    *max = arr[i];
    *min = arr[i];
    return ;
  }
  else{
    divi(arr,i,(i+j)/2,&lmax,&lmin);
    divi(arr,(i+j)/2+1,j,&rmax,&rmin);
    *max = lmax > rmax ? lmax:rmax;
    *min = lmin < rmin ? lmin:rmin;
    return;
  }  
}

思考:

在递归程序中如何联系上下的信息,或者说如何在父子函数间使用信息。返回值可以返回一个指向某一数据结构的指针,加以利用,但在这里使用显得不太直观。要清楚一点,返回给父函数的是什么,如这里的max和min。lmax,lmin,rmax,rmin通过反馈回来的信息,在该函数内使用,最后再通过比较返回给上以函数信息,这样循环。也就是说,由函数参数列表知道反馈信息,由该函数内的变量去处理哪些,只考虑自己可以使用的信息就行,不要去在意太多的细节。

如有5个元素,下标为0~4,递归关系如下

(0,4)在该范围会处理(0,2)和(3,4)反馈的四个变量

    (0,2)在该范围内会由四个量去处理,所以设置4个变量,最后通过指针反馈一大一小

        (0,1)

            (0,0)会得到min,max为同一值(下同)

            (1,1)

        (2,2)

    (3,4)

        (3,3)

        (4,4)

所以如果有时需要这么处理可以先画一下轮廓,再分析一下需要多少辅助变量。

你可能感兴趣的:(二分法)