function FindNum(aNum, aBegin, aEnd: Integer): Integer;function TForm1.FindNum(aNum, aBegin, aEnd: Integer): Integer;
var
  liBegin, liEnd, liCenter: Integer;
begin
  if (aNum<aBegin) or (aNum>aEnd) then
  begin
    Result:=0;
    Exit;
  end;
  liBegin :=aBegin;
  liEnd   :=aEnd;
  liCenter:=liBegin+Round( (liEnd-liBegin)/2 );
  mList.Lines.Add( '第 '+FormatFloat('0000', temp+1)+' 次:'+FormatFloat('0000', liCenter)+
                                         ' 起:'+FormatFloat('0000', liBegin)+
                                         ' 止:'+FormatFloat('0000', liEnd) );
  if aNum<liCenter then
  begin
    temp:=temp+1;
    liEnd:=liCenter;
    FindNum(aNum, liBegin, liEnd);
  end
  else if aNum>liCenter then
  begin
    temp:=temp+1;
    liBegin:=liCenter;
    FindNum(aNum, liBegin, liEnd);
  end;  Result:=temp+1;
end;FindNum(200, 0 , 1000);

解决方案 »

  1.   

    折半查找的例子吧找到aNum是否在aBegin和aEnd的中间返回值时进行了几次查找memo中会显示怎么找的
      

  2.   

    什么叫一次判断?什么这么多次判断?典型的递归方式进行折半查找啊,你还能怎么解释?这个程序就是体现了折半查找的效率 对于2^n个排序数据只需要找n次就可以找出目标数据的位置ft只不过写程序的人太烂,太蹩脚折半查找嘛,用什么例子不好,非得用连续的数字,如果用数组就不会让人摸不着头脑了
      

  3.   

    rustle() 你说的有道理 但是我的功能和你的有差别 我的功能上面已经说清楚 你说的是正规的二分法查找 和我的不是一样哦 有差异。所以不用数组。
      

  4.   

    按照你的说法,好像不是那么烂了 :)不过最烂的是这里:
        liBegin:=liCenter;
        FindNum(aNum, liBegin, liEnd);干什么?这样程序好看么?
      

  5.   

    直接FindNum(aNum, liCenter, liEnd);不对么?
      

  6.   

    呵呵 那就要分别写成这样了:
      if aNum<liCenter then
      begin
        temp:=temp+1;
        FindNum(aNum, liBegin, liCenter);
      end
      else if aNum>liCenter then
      begin
        temp:=temp+1;
        FindNum(aNum, liCenter, liEnd);
      end;  呵呵 这样也好 不过我写成了统一格式:  if aNum<liCenter then
      begin
        temp:=temp+1;
        liEnd:=liCenter;
        FindNum(aNum, liBegin, liEnd);
      end
      else if aNum>liCenter then
      begin
        temp:=temp+1;
        liBegin:=liCenter;
        FindNum(aNum, liBegin, liEnd);
      end;  确实是为了好看 别见笑啊 人家是个完美主义者 不过以后会注意的 谢谢!
      

  7.   

    废话 当然结不了!因为 他们说的并不是这个函数的本质功能 光看表面 谁都能知道 简单问题还用拿出来问吗?
    我讨厌有人问类似这样的问题:
    s1='a';
    s2='b';
    如何实现s='a,b';
      

  8.   

    我不知道你的所谓本质是什么按照我理解的你的意思,表面:这是一个递归实现的折半查找(或者不是折半查找);本质:是模拟人的寻找某数字的算法如果是这样,你恰恰是本末倒置了试问:谁能看着你的程序就知道你写的是“模拟人的寻找某数字的算法”??inc(i),你知道这个完成什么功能吗?i + 1?ft,错了,他表示模拟人的年龄增大一岁...