递归习题

本文介绍了递归在编程中的应用,通过实例分析了递归的执行过程和递归次数的影响因素,包括快速排序的递归策略。同时,讨论了递归函数的特点,如终止条件和递归部分,并探讨了递归与非递归过程的转换。此外,还提供了解决汉诺塔问题和计算阶乘的递归算法,并讨论了递归调用的次数及其优化方法,例如尾递归。最后,通过辗转相除法展示了求最大公约数的递归实现及时间复杂度分析。

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

            题   源            

牛客网-》题库-》专项练习-》递归

    拣选的试题 与 答案记录   

 

1.

队列 在 程序调用时 必不可少,因此 递归 离不开队列

:递归离不开 栈

 

2.

执行完如下语句后,i的值为 48

#include <stdio.h>

int f(int x)

{

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

}

 

int main()

{

    int i = f(f(2));

    printf("i = %d\n",i); // 48

}

 

3-1.

采用 递归方式,对 顺序表 进行快速排序,下列关于递归次数 的叙述,正确的是

A 递归次数 与 初始数据 的 排列次序 无关

B 每次划分后,先处理 较长的分区 可以减少 递归次数

C 每次划分后,先处理 较短的分区 可以减少 递归次数

D 递归次数 与 每次划分后得到的 分区处理顺序 无关

 

3-2.

对 n个记录的线性表 进行 快速排序,为了减少算法的递归深度,如下叙述正确的是 A

A每次分区后,先处理较短的部分

B 每次分区后,先处理较长的部分

C 与 算法 每次分区后 的 处理顺序 无关

解析:

在快速排序中,需要使用递归来分别处理左右子段,递归深度可以理解为系统栈保存的深度,先处理短的分段再处理长的分段,可以减少时间复杂度;

如果按长的递归优先的话,那么短的递归会一直保存在栈中,直到长的处理完。短的优先的话,长的递归调用没有进行,他是作为一个整体保存在栈中的,所以递归栈中的保留的递归数据少一些。

举例分析:

现在有这么个序列:123456789

假设每次划分出短序列的长度为1

即第一次划分

短序列:1

长序列:23456789

如果优先处理短序列1

则栈中仅用保存23456789,深度为1

然后23456789出栈,划分

短序列:2

长序列:3456789

同样的先处理短序列

栈中保存3456789,深度为1

类推下去,处理完整个序列,栈的最大深度都为1

 

假如每次划分出的短序列长度为2呢

短序列:12

长序列:3456789

优先处理短序列12

栈中保存3456789 深度为1

12只能划分为同样长度的序列1和2

先处理左边的

栈保存2 此时栈中有3456789 和 2 深度为2

然后2 出栈 处理

接着3456789出栈

划分为短序列34

长序列 56789

处理短序列34

栈中保存56789

类推下去,处理完整个序列,栈的最大深度都为2

也就是说栈的最大深度取决于划分出来的短序列的长度 (前提是先处理短序列)

那么先处理长序列呢

短序列:1

长序列:23456789

如果优先处理长序列序列23456789 短序列入栈,长序列划分为2和3456789

2入栈,3456789划分。。。

8入栈,9处理

此时栈中有12345678 深度为8

 

短序列:12

长序列:3456789

12入栈 3456789划分为34和56789

34入栈 56789划分为56和789

56入栈

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值