|
|
|
|
移动端

1.12.1 函数调用(1)

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

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

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


1.12 函数

1.12.1 函数调用(1)

【真题 166】定义有函数 int func(int i),它的实现如下:

  1. int func(int i)  
  2. {  
  3. if(i > 1)  
  4. return i*func(i-1);  
  5. else  
  6. return 1;  

那么调用 f(5)方法的返回值为()阶乘计算。

A.5 B.15 C.20 D.120 答案:D。在分析递归的问题时,昀重要的是找出递归表达式与递归结束的条件。本题中,递归调用的过程为

func(5)=5*func(4)=5*4*func(3)=5*4*3*func(2)=5*4*3*2*func(1)=5*4*3*2*1=120。这个函数实际上是用来求解 i的阶乘。所以,选项 D正确。

【真题 167】以下代码是用来计算 100以内的素数的个数,请把相应的空填上。

  1. struct prime_number_node  
  2. {  
  3. int prime_number;  
  4. prime_number_node* next;  
  5. };  
  6. int calc_prime_number()  
  7. {  
  8. prime_number_node* list_head = new prime_number_node();  
  9. list_head->next = NULL;  
  10. list_head->prime_number = 2;  
  11. prime_number_node* list_tail = list_head;  
  12. for (int number = 3; number < 100; number++)  
  13. {  
  14. int remainder;  
  15. prime_number_node* cur_node_ptr = list_head;  
  16. while (cur_node_ptr != NULL)  
  17. {  
  18. remainder = number%cur_node_ptr->prime_number;  
  19. if (remainder == 0)  
  20. {  
  21. //1  
  22. }  
  23. else  
  24. {  
  25. //2  
  26. }  
  27. }  
  28. if (remainder != 0)  
  29. {  
  30. prime_number_node* newnew_node_ptr = new prime_number_node();  
  31. new_node_ptr->prime_number = number;  
  32. new_node_ptr->next = NULL;  
  33. list_tail->next = new_node_ptr;  
  34. //3  
  35. }  
  36. }  
  37. int result = 0;  
  38. while (list_head != NULL)  
  39. {  
  40. result++;  
  41. prime_number_node* temp_ptr = list_head;  
  42. list_headlist_head = list_head->next;  
  43. //4  
  44. }  
  45. return result;  

答案:1、2、3、4四行代码依次为:

break;
cur_node_ptr = cur_node_ptr->next;
list_tail = list_tail->next;
delete temp_ptr;


对于空白 1,一旦满足 remainder==0,说明这个数不是素数,此时没有必要判断这个数能否被其他数整除了,可以直接跳出循环,继续判断下一个数是否为素数,因此,这里的代码需要能够跳出循环,跳出循环的代码为 break。

对于空白 2,本题判断一个数 n是否为素数的方法为:只需把 n被小于 n的每一个素数去除,如果都不能被整除,那么 n就是一个素数。在 2处需要取下一个素数,然后判断能否被当前遍历到的数整除,取链表下一个结点的代码为: cur_node_ptr = cur_node_ptr->next。

对于空白 3,当代码执行到 3的时候,说明当前遍历到的元素值是素数,需要把这个素数添加到链表的尾部。由于链表增加了一个新的结点,因此,需要更新指向尾结点的指针: list_tail = list_tail->next或 list_tail= new_node_ptr。

对于空白 4,由于这个函数只需返回素数的个数,因此,在函数结束的时候,需要把存储素数的链表中结点占用的空间给释放掉。释放结点占用的空间的代码为: delete temp_ptr;。

【真题 168】当 n=5时,下列函数的返回值是()。

  1. int foo(int n){  
  2. if (n<2)  
  3. return n;  
  4. else  
  5. return foo(n - 1) + foo(n - 2);  

A.5 B.7 C.8 D.10答案:A。对于递归调用而言,昀重要的就是要找到递归调用结束的条件。以本题为例,递归调用的过程如下图所示。

按照上述调用过程执行,当调用到函数 f的参数满足递归的结束条件 n<2时,递归结束,此时会返回

函数调用的结果。对于本题而言,昀后递归调用的结果就是所有叶子结点的和。由于 f(1)=1,f(0)=0,叶子结点总共有 5个 f(1),因此,这个函数调用的结果为 5。递归调用结束后程序的运行过程如下图所示。

【真题 169】有如下代码,那么函数 fun(484)的返回值为()。

  1. bool fun(int n)  
  2. {  
  3. int sum = 0;  
  4. for (int i = 1; n>sum; ii = i + 2)  
  5. sumsum = sum + i;  
  6. return (n == sum);  

A.True B.False C.不确定答案:A。本题中,要想知道函数的返回值,关键就需要洞悉函数的执行过程,当进行 for循环时,一共执行

了以下内容:

循环 1:sum=1,i=3循环 2:sum=4,i=5

循环 3:sum=9,i=7循环 4:sum=16,i=9

循环 5:sum=25,i=11循环 6:sum=36,i=13

循环 7:sum=49,i=15...

通过规律可以发现, sum的值为循环次数的平方,本题中, 22*22=484,循环退出时, sum=484,函数返回 true。而 sum的值等于 1+3+5+...+k=(k+1)^2/4,且 k为奇数, (k+1)^2/4 >= n时循环结束, n的值为 484,(k+1)^2 >=1936,如果存在奇数 k使得等式成立,则函数返回 true,否则,返回 false,正好当 k=43时,等号成立。因此,返回 true。所以,选项 A正确。

【真题 170】有如下代码,那么函数 f(1)的返回值为()。

  1. int f(int n)  
  2. {  
  3. static int i = 1;  
  4. if (n >= 5)  
  5. return n;  
  6. nn = n + i;  
  7. i++;  
  8. return f(n);  

A.5B.6C.7D.8

答案:C。

本题中,首先定义了一个静态变量 i,它的值初始化为 1,以后每次调用 f函数,该值都不会重新初

始化,而会在原来的基础上继续执行后续操作。具体执行过程如下:

1)执行 f(1),静态变量 i的值为 1,由于 n的值为 1,所以,执行完代码以后, n的值变为 2,i的值变为 2,此时返回 f(2)。

2)执行

f(2),n的值变为 4,i的值变为 3,此时返回 f(4)。

3)执行

f(4),n的值变为 7,i的值变为 4,此时返回 f(7)。

4)执行

f(7),由于 7>5,此时返回 7。

所以,f(1)=7。因此,选项 C正确。

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

51CTO读书频道二维码


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

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

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

读 书 +更多

C#2005编程进阶与参考手册

本书非常详细而全面地介绍了C#程序设计语言。本书不是“5分钟学习C#”式的手册,也不是那种教您“照猫画虎”地创建一些与您的实际工作需要...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊