现在的位置: 首页 > 综合 > 正文

博彦科技笔试题目之递归调用详解

2013年08月26日 ⁄ 综合 ⁄ 共 1125字 ⁄ 字号 评论关闭

     www.btestingsky.com旗下大头针出品

这次北大测试北航校区有5,6个学员参加博彦科技软件测试工程师招聘.这次题目是:编写一个汉诺塔程序.

呵呵有没有不知道汉诺塔为何物的?汉诺塔是软件递归调用里面最经典的一个案例.

#include<stdio.h>

 int c=0; /* 全局变量,搬动次数 */

 void move(char x,int n,char z)
 { /* 第n个圆盘从塔座x搬到塔座z */
   printf("第%i步: 将%i号盘从%c移到%c/n",++c,n,x,z);
 }

 void hanoi(int n,char x,char y,char z)
 { /* 将塔座x上按直径由小到大且自上而下编号为1至n的n个圆盘 */
   /* 按规则搬到塔座z上。y可用作辅助塔座 */
   if(n==1)
     move(x,1,z); /* 将编号为1的圆盘从x移到z */
   else
   {
     hanoi(n-1,x,z,y); /* 将x上编号为1至n-1的圆盘移到y,z作辅助塔 */
     move(x,n,z); /* 将编号为n的圆盘从x移到z */
     hanoi(n-1,y,x,z); /* 将y上编号为1至n-1的圆盘移到z,x作辅助塔 */
   }
 }

 void main()
 {
   int n;
   printf("3个塔座为a、b、c,圆盘最初在a座,借助b座移到c座。请输入圆盘数:");
   scanf("%d",&n);
   hanoi(n,'a','b','c');
 }

大头针的有感:

这是严老师里面给出的程序,相当的好.

为什么会出这样的题目呢?仅仅是因为它经典吗?不止如此:

大家知道C语言是由函数组成的,函数之间是要互相调用的,调用的时候函数分为主调函数和被调函数.

一个函数的运行期间调用另一个函数时,在运行被调用函数之前,系统需要完成3件事情:(1)将所有的实参、返回地址等信息传递给被调用函数保存;(2)为被调用函数的局部变量分配存储区;(3)将控制转移到被调函数的入口。

而从被调用函数返回调用函数之前,系统也应完成3件工作:(1)保存被调函数的计算结果;(2)释放被调函数的数据区;(3)依照被调函数保存的返回地址将控制转移到调用函数。当有多个函数构成嵌套调用时,按照后调用先返回的原则。

函数的调用原则和数据结构栈的实现是相一致。也说明函数调用是通过栈实现的。
函数嵌套调用中比较特殊的是递归调用,而递归调用里面中最经典的算法就是汉诺塔。所以博彦这次考试题目是汉诺塔。

这样不但考察了我们递归调用,还考察了我们对数据结构栈的理解,而且还考察我们对基础知识掌握能力.真是一举多得也!

想了解数据结构栈:

请点击:

 企业常见笔试题目---数据结构栈与进制转换

 

抱歉!评论已关闭.