挑剔数列和递归算法

前几天的一道笔试题:

有一种很特别的数列 L(n),定义为:把集合{1,2,3,...,n,1,2,3,...,n}的数字进行重新排列,使得1和1之间的距离为1,2和2之间的距离为2,3和3之间的距离为3,4和4之间的距离为 4 等等。 


Python实现,Version 1.0:


输出结果:


放置的数是随机的,所以经常出现递归栈溢出的情况。虽然多试几次还是能获得结果,但是不太理想。


阅读递归资料的时候想到了要加一个redo的操作,改进之后,Version 2.0:


实现方法可以行得通了。

4的输出:


7的输出:


15的输出:


中间有写数字无法输出,比如9:


就是说,我从代码中操作集pop,结果pop为空,redo的数量满足了,相当于撤销还是无法完成该数列,因此,猜想,某些长度是无法生成该数列的。

了解到,该数列是一个挑剔数列,当n属于{0, 1, 2, 3 ... n ... }时,length 等于 4n+1 与 4n+2 时,没有该挑剔数列。


以上。

### 斐波那契数列递归与非递归算法的时间复杂度分析 斐波那契数列递归与非递归实现方式在时间复杂度上存在显著差异,主要源于两种方法对问题求解的方式不同。 #### 1. 递归算法的时间复杂度 递归实现斐波那契数列时,每个函数调用都会进一步拆分为两个子调用,形成一棵递归树。对于输入值 \( N \),递归树的高度为 \( N-1 \),每一层的节点数呈指数增长。具体来说,递归树的总节点数近似为 \( 2^{N-1} \)。因此,递归算法的时间复杂度为 \( O(2^N) \)[^1]。这种复杂度使得递归方法在处理较大 \( N \) 时效率极低。 此外,递归过程中会重复计算相同的子问题。例如,在计算 \( Fib(N) \) 时,\( Fib(N-1) \) \( Fib(N-2) \) 都会被多次调用,导致冗余计算。这也是递归方法性能较差的主要原因之一[^4]。 #### 2. 非递归算法的时间复杂度 非递归实现通常采用动态规划或迭代的方式。通过从底向上依次计算斐波那契数列的每一项,并将中间结果存储在变量中,避免了重复计算的问题。这种方法的时间复杂度为 \( O(N) \),因为只需要遍历一次数列即可完成计算。 以下是典型的非递归实现代码: ```python def fibonacci_iterative(n): if n == 0: return 0 elif n == 1: return 1 a, b = 0, 1 for _ in range(2, n + 1): a, b = b, a + b return b ``` #### 3. 时间复杂度比较 | 算法类型 | 时间复杂度 | |------------|------------------| | 递归算法 | \( O(2^N) \) | | 非递归算法 | \( O(N) \) | 从表中可以看出,非递归算法的时间复杂度远低于递归算法。随着 \( N \) 的增大,递归算法的运行时间呈指数级增长,而非递归算法则保持线性增长[^1]。 #### 4. 实际应用中的选择 由于递归算法的时间复杂度较高且存在大量重复计算,实际工程中不建议使用递归方法来计算较大的斐波那契数。相比之下,非递归方法不仅效率更高,而且占用的空间也更少[^1]。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值