4、arch(a,x,i,mid–1);//在mid前面继续找if(x>a[mid])returnBSearch(a,x,mid+1,j);//在mid后面继续找}…ai…amid-1amidamid+1…aj…思想:小大找xvoidmain(){intA[]={1,3,4,5,17,18,31,33};intidx=BSearch(A,17,0,7);if(idx==-1){printf(“未找到”);}else{printf(“%d”,idx);}}请用VC跟踪程序执行过程,并考察进程的栈的变化
5、。递归算法有效的分析问题的方法有效的算法设计的方法有效但不实用思想:一个较复杂问题,分解为若干个相对简单的同类子问题;(如问题规模大)(规模变小)重复这一过程;最后子问题变成能直接求解。设计:原问题、子问题求解都适用的函数(接口);设计递归出口(直接求解)。[例3]Hanoi塔问题。ABCn个盘子,3根柱子。初始:最后:ABC操作:每次只能拿一个盘子从一个柱子放到另一个柱子上;且大盘不能压小盘;输出步骤问题抽象:A上n个盘子借助于B放到C上。voidHanoi(intn,charA,charB,
6、charC){if(n==0){return;}else{Hanoi(n-1,A,C,B);//上面n-1张盘从A借助于C放到B中printf(“%c->%c”,A,C);//A上面一张盘放到C上Hanoi(n-1,B,A,C);//上面n-1张盘从B借助于A放到C中}}voidmain(){intn;n=Hanoi(4,‘A’,‘B’,‘C’);}运行结果:步数o(n!)[例4]设计一个输出如下形式数值的递归算法:nnnn333221……………voidDisplay(intn){print
7、f(“”);for(inti=1;i<=n;++i)printf(“%d”,n);if(n>1)Display(n-1);}[例5]求2个正整数n和m最大公约数的递推定义式为:gcd(n,m)=gcd(m,n),当n0时voidgcd(intn,intm){if(n<0
8、
9、m<0)return0;if(m==0)returnn;elseif(m>n)returngcd(m,n);elsereturngcd(m,n%m);}(本节完)C语言中函数
10、调用过程(包括递归调用)是用栈实现的。intFact(intn){intx,y;if(n<=0){return1;}else{x=n;y=Fact(x-1);return(x*y);}}voidmain(){intn;n=Fact(3);}我们对例1另写为:00111122236n注意:这里只写出调用参数和局部变量;实际情况可跟踪程序执行。nxynxynynxy进栈退栈main()Fact(3);Fact(2);Fact(1);Fact(0);x效率时间空间(栈)效果不好,但算法易理解。[例]F