|
|
|
|
移动端

1.12.1 函数调用(3)

《程序员面试笔试真题与解析》本书针对当前各大 IT企业面试笔试中特性与侧重点,精心挑选了 3年以来近百家典型 IT企业的面试笔试真题,这些企业涉及业务包括系统软件、搜索引擎、电子商务、手机 APP、安全关键软件等,面试笔试真题非常具有代表性与参考性。本节为大家介绍函数调用。

作者:猿媛之家来源:机械工业出版社|2017-12-06 17:31

有奖调研 | 1TB硬盘等你拿 AI+区块链的发展趋势及应用调研


1.12.1 函数调用(3)

【真题 172】 ack(3 , 3)的执行结果是()。

  1. int ack(int m, int n)  
  2. {  
  3. if (m == 0)  
  4. return n + 1;  
  5. else if (n == 0)  
  6. return ack(m - 1, 1);  
  7. else  
  8. return ack(m - 1, ack(m, n - 1));  

答案:61。

根据题目中的代码可知, ack(1,x)=ack(0,ack(1,x-1)) = ack(1,x-1)+1;ack(1,x)是一个首项为 ack(1,1),公差为 1的等差数列,而 ack(1,1)=ack(0,ack(1,0))=ack(1,0)+1=ack(0,1)+1=3,ack(1,x)=2+x,ack(2,x) = ack(1,ack(2,x-1))=2+ack(2,x-1),所以, ack(2,x)是一个首项为 ack(2,1),公差为 2的等差数列,而 ack(2,1) = ack(1,ack(2,0))=2+ack(2,0)=2+ack(1,1)=5,所以, ack(2,x)=3+x*2。而 ack(3,0)=ack(2,1)=5, ack(3,1)= ack(2,ack(3,0))=ack(3,0)*2+3=13,ack(3,2)=ack(3,1)*2+3=29,ack(3,3)=ack(3,2)*3+2=61。

所以,本题的答案为 61。

【真题 173】有如下代码:

  1. int fuc(int m, int n)  
  2. {  
  3. if (m%n == 0)  
  4. {  
  5. return n;  
  6. }  
  7. else  
  8. {  
  9. return fuc(n, m%n);  
  10. }  

函数 fuc(2012,2102)的结果是()。

答案:2。

对于函数 func而言,其函数参数有两个,分别为整型数 m与整型数 n,当 m%n==0,即 m能够整除 n时,返回的是 n的值,否则,返回的是 fuc(n,m%n)。

当 m为 2012,n为 2102时,其执行过程如下:

1)m%n的结果不为 0,于是返回值为 fuc(2102,2012)。

2)此时

m的值为 2102,n值为 2012,m%n的值为 90,不等于 0,于是返回 fuc(2012,90)。

3)此时

m的值为 2012,n的值为 90,m%n的值为 32,不等于 0,于是返回 fuc(90,32)。

4)此时

m的值为 90,n的值为 32,m%n的值为 26,不等于 0,于是返回 fuc(32,26)。

5)此时

m的值为 32,n的值为 26,m%n的值为 6,不等于 0,于是返回 fuc(26,6)。

6)此时

m的值为 26,n的值为 6,m%n的值为 2,不等于 0,于是返回 func(6,2)。

7)此时

m的值为 6,n的值为 2,m%n的值为 0,此时返回 n的值,即为 2。

所以,最终的返回值为 2。

【真题 174】有如下代码:

  1. int main()  
  2. {  
  3. int x = 3;  
  4. printf("%d", x);  
  5. return 1;  

函数既然不会被其他函数调用,为什么返回值为 1?答案:在 C语言中,标准认为 0表示成功,非 0表示错误。操作系统用数字 1来判断该程序是否执行成功。

【真题 175】有如下代码:

  1. int f(unsigned int n)  
  2. {  
  3. if(n==0||n==1)  
  4. return 1;  
  5. else  
  6. return n*f(n-1);  

上面算法的时间复杂度为()。

A.O(1) B.O(n) C.O(N*N) D.O(n!)

答案:B。

【真题 176】有如下代码:

  1. int i;  
  2. char a[10];  
  3. string f();  
  4. string g(string &str); 

下面能编译通过的是( )。

A.if(!!i){f();}  B.g(f());    C.a=a+1;  D.g("abc");

答案:A。

对于选项 A,i是一个 int型变量,!!i的写法表示执行两次取反操作,然后将该表达式的值作为 if语句的判断条件,当满足条件时,执行函数 f(),虽然函数 f()的返回值为 string类型,但是没有规定一定要去用变量接收返回数据。例如, printf()函数的原型是: int printf(const char *format, ...),返回输出的字符的个数,但几乎没人会去处理这个返回值。所以,选项 A正确。

对于选项 B,函数 f()返回的是一个临时量,然后该临时量作为函数 g的参数,由于函数 g的参数不

是 const引用,它不能引用临时量。所以,选项 B错误。对于选项 C,a是一个字符数组, a表示的是一个地址常量,它不能再被赋值。所以,选项 C错误。对于选项 D,“abc”的类型是 const char*,是一个常量指针,而函数 g的参数是 string的引用,无

法作为函数 g的参数。所以,选项 D错误。

【真题 177】下列函数定义中,有语法错误的是()。

A.void fun(int x, int *y){x *= *y;} B.int * fun(int *x, int y){return x += y;}

C.void fun(int *x, int y){*x += y;} D.void fun(int x, int *y){*x *= *y;}答案:D。对于选项 A、选项 B、选项 C,语法都正确。对于选项 D,x为一个整型变量,对变量 x执行*操作是错误的,所以,选项 D错误。

【真题 178】以下关于内联函数,说法正确的是()。

A.一般用于加快程序执行速度 B.可能减小可执行文件大小

C.可能增加可执行文件大小 D.以上说法都不正确答案:A、B、C。对于选项 A,内联函数能够避免函数调用堆栈的开销,从而加快程序执行的速度。所以,选项 A正确。对于选项 B,如果这个内联函数被优化,优化后代码可能会变短。如果这个内联函数没有被展开,

或者内敛函数被展开了但是只调用了一次,在这种情况下会减小可执行文件的大小。所以,选项 B正确。对于选项 C,内联函数类似宏,在调用处生成,它可能会增加可执行文件的大小。所以,选项 C正确。

喜欢的朋友可以添加我们的微信账号:

51CTO读书频道二维码


51CTO读书频道活动讨论群:365934973

【责任编辑:book TEL:(010)68476606】

回书目   上一节   下一节
点赞 0
分享:
大家都在看
猜你喜欢

读 书 +更多

网络工程师必读——接入网与交换网

本书是以一个典型的计算机广域网通信为背景进行编写的,详细、全面地介绍了通信网中最主要的两个部分:目前,国内外接入网与交换网的主要技...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊