牛客网专项练习(十一)

本文详细介绍了递归的概念,特点以及在编程中的应用。通过解析递归问题的实例,如递归函数的调用过程,展示了递归在解决复杂问题时的思维方式。同时,文章还探讨了递归调用的栈数据结构,强调了递归终止条件的重要性,并通过一系列选择题帮助读者巩固理解递归的知识点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、从前有座山,山里有座庙,庙里有个老和尚,再给小和尚讲故事,故事内容是:从前有座山,山里有座庙,庙里有个老和尚,再给小和尚讲故事,故事内容是:从前有座山,山里有座庙,庙里有个老和尚,再给小和尚讲故事,故事内容是……描述的是()

正确答案: E   你的答案: E (正确)

贪心
回溯
穷举
分治
递归

解题思路:

递归指的是一个过程:函数不断引用自身,直到引用的对象已知。


2、一个递归算法必须包括()

正确答案: B   你的答案: B (正确)

递归部分
终止条件和递归部分
迭代部分
终止条件和迭代部分

解题思路:

递归就是指程序调用自身的编程思想,即一个函数调用本身;

迭代是利用已知的变量值,根据递推公式不断演进得到变量新值的编程思想。

递归体和递归出口


3、在递归算法执行过程中,计算机系统必定会用到的数据结构是( )

正确答案: C   你的答案: C (正确)

队列
链表
二叉树

解题思路:

栈的特点是“先进后处,后进先出”,在程序执行过程中,主程序先进栈,被调用的程序后进栈;当被调用程序结束后,先出栈,最后主程序运行结束了,主程序才出栈。 递归的过程,利用栈保存现场地址,然后将数据入栈,运算,后出栈,返回结果。


4、执行完下列语句段后,i值为()

1

2

3

4

5

int f(int x){

    return ((x>0)?x*f(x-1):2)

}

int i;

i=f(f(2));

正确答案: B   

4
48
8
无限递归

解题思路:

f(x) 当x大于0时,返回x*f(x-1),否则返回2

f(0) = 2

f(1) = 1 * f(0) = 2

f(2) = 2 * f(1) = 4

f(3) = 3 * f(2) = 12

f(4) = 4 * f(3) = 48

f(4) = f(f(2))   = 48


5、只有那种使用了局部变量的递归过程在转换成非递归过程时才必须使用栈()

正确答案: B   你的答案: B (正确)

解题思路:

递归工作栈里面包括返回地址、本层的局部变量和递归调用的形参代换用实参,所以正常情况下,无论递归过程有没有使用局部变量,转换为非递归过程都需要用栈来模拟这个递归调用过程

当然,有一些特殊递归不用栈就可以直接转换,比如尾递归、常系数递推等,无论是否有局部变量


6、以下关于递归调用的说法正确的是()

正确答案: C   

函数间接调用自己不是递归
递归调用可以用队列实现
递归调用可以用栈实现
函数直接调用自己是递归

解题思路:

递归的定义:

递归调用是一种特殊的嵌套调用,是某个函数调用自己或者是调用其他函数后再次调用自己的,只要函数之间互相调用能产生循环的则一定是递归调用。

递归的特点:

  • 函数要直接或间接调用自身。   (A错误
  • 要有递归终止条件检查,即递归终止的条件被满足后,则不再调用自身函数,函数的调用原则和数据结构栈的实现是相一致。(类似于不断压栈,直到栈满,作为终止条件,C正确
  • 如果不满足递归终止的条件,则调用涉及递归调用的表达式。在调用函数自身时,有关终止条件的参数要发生变化,而且需向递归终止的方向变化。(函数直接调用自己加上递归的终止条件是递归,所以D错误

7、设有一个递归函数如下

1

2

3

4

5

6

7

int  f(int n)

{   

     if(n<=3)    

         return 1;

    else 

        return f(n-2)+f(n-4)+1;

}

试问计算f(8)时,函数f返回(    )。

正确答案: D   

6
7
8
9

解题思路:

考察的是递归运算原理。

8>3

所以f(8)=f(8-2)+f(8-4)+1

            =f(6)+f(4)+1                        6>3,4>3

            =f(4)+f(2)+1+f(2)+f(0)+1+1

            =f(2)+f(0)+1+f(2)+1+f(2)+f(0)+1+1

            =1+1+1+1+1+1+1+1+1

            =9


8、设有一个递归算法如下

1

2

3

4

int f(int n) {

    if(n<=3) return 1;

    else return f(n-2)+f(n-6)+1;

}

试问计算f(f(9))时需要计算()次f函数。

正确答案: C   你的答案: C (正确)

10
11
12
14

解题思路:

一、先算内层f(9)

    [1] 计算 f(9) = f(7) + f(3) + 1;

    [2] 计算[1]中 f(7) = f(5) + f(1) + 1;

    [3] 计算[2]中 f(5) = f(3) + f(-1) + 1;

    [4] 计算[3]中 f(3) = 1;

    [5] 计算[3]中 f(-1) = 1;

        {至此f(5)可计算得: f(5) = 1 + 1 + 1 = 3}

    [6] 计算(1)中f(1) = 1;

        {至此f(7)可计算得 :f(7) = 3 + 1 + 1 = 5}

    [7] 计算[1]中f(3) = 1;

        {至此f(9)可计算得:f(9) = 5 + 1 + 1 = 7}

计算f(9)一共调用了7次函数

二、计算外层f(7)

    由上面步骤可知,计算f(7)调用了5次函数

所以一共调用了函数7+5=12次


9、设有递归算法如下,最终打印结果是()

1

2

3

4

5

6

7

8

9

10

11

#include<stido.h>

 int foo(int a ,int b)

 {

     if (b == 0) return 0;

     if (b %2 == 0) return foo(a+a,b/2);

     return foo(a+a,b/2)+a;    

 }

 void main()

 

   printf("%d",foo(1,3));

 }

正确答案: A   

3
4
5
6

解题思路:

计算foo(1,3):此时a=1,b=3;

跳过两个if语句进入return foo(1+1,3/2)+1,即foo(2,1)+1;

计算foo(2,1):

同样,跳过两个if语句进入return foo(2+2,1/2)+2,即foo(4,0)+2;

计算foo(4,0):

进入第一个if语句,return 0;

逐层返回,得foo(2,1)=0+2=2;

再返回上一层,得foo(1,3)=2+1=3;

返回结果,foo(1,3)=3;


10、考虑下面递归表达式:

那么T(n)=()

正确答案: A   你的答案: A (正确)

O((LogLogn))^2

O((LognLogn))^2

O((LogLogn))

O((LognLogn))

解题思路:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值