递推递归-J - 数学黑洞

探讨一个数学问题,通过特定算法操作四位数直至达到6174这一神秘数值,介绍实现过程及代码示例。

题目:

Description

任意一个4位自然数N(N不能是4个数字一样,如1111、2222、….9999是不可以的,N也不能是6174),将组成自然数N的4个数字重新排列,形成一个最大数和最小数,最大数和最小数相减,其差还是自然数,将差的各数字再重新排列,又形成一个最大数和最小数,最大数和最小数相减,其差还是自然数。反复进行,直到差是一个神秘数6174(数学黑洞)结束。

Input

输入数据有多组,每组占一行,每行包含一个4位自然数N。输入文件直到EOF为止!

Output

对每组输入,输出有2行。第一行是所有的差,以空格分隔,最后一个数后也有空格;第二行是差的个数。

Sample Input

1000
1500
3000

Sample Output

999 8991 8082 8532 6174
5
5085 7992 7173 6354 3087 8352 6174
7
2997 7173 6354 3087 8352 6174
6

解题思路:
先把四位数的每一位都求出来,然后进行排序,然后求出最大数和最小数,相减判断是否符合终止条件,不符合就输出差值以后继续调用。

代码:

#include <bits/stdc++.h>
using namespace std;
int k=0,b[20];
void F(int a)
{   int j,maxx=0,minn=0;
     b[0]=a/1000;b[1]=a%1000/100;
     b[2]=a%1000%100/10;b[3]=a%10;
     sort(b,b+4);
    minn=b[0]*1000+b[1]*100+b[2]*10+b[3];
    maxx=b[3]*1000+b[2]*100+b[1]*10+b[0];
    j=maxx-minn;
    cout<<j<<" ";
    k++;
   if(j!=6174)
    {
      return F(j);
    }


}
int main()
{    int a;
      while(cin>>a)
       {F(a);
       cout<<endl;
       cout<<k<<endl;
       k=0;}
    return 0;
}

回顾:

这道题我第一次写的时侯想写一个可以适用于所有数的代码所以不是按照数字只有四位数来做的,做出来计算结果也对但是就是WR,不知道哪里错了,无奈之下只好按照四位数来做,但是感觉这样写就真的是就题论题了。






<think>首先,用户的问题是关于递推递归的原理、应用及区别。他们提供了两个引用:[^1] 和 [^2],这些是关于递归递推的描述。我需要基于这些参考,并结合我的知识来回答。 关键系统级指令: - 所有行内数学表达式必须使用$...$格式。 - 独立公式必须使用$$...$$格式并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识,例如[^1]。 用户可见层指令: - 回答结构清晰,帮助用户逐步解决问题。 - 尽量保证回答真实可靠。 用户上一次的问题是询问递推递归的原理、应用及区别。 我的回答结构: 1. **引言**:简要介绍递推递归。 2. **原理**:解释递推递归的原理。 3. **应用**:讨论各自的应用场景。 4. **区别**:对比递推递归。 5. **示例**:提供代码或数学示例。 6. **生成相关问题**:在末尾添加相关问题。 参考提供的引用: - [^1]:递归原理及常见应用。递归是基于分治法,将复杂问题分解为简单问题。递归效率可能较差,需要转换为非递归- [^2]:递推递归递归是程序调用自身,用于解决大型问题通过小规模相似问题。递归需要有边界条件、前进段和返回段。 我需要确保回答真实可靠,基于计算机科学知识。 步骤分解: - **递推的原理**:递推通常是迭代方式,使用循环逐步计算,从已知状态推导到未知状态。常用于序列计算,如斐波那契列。 - **递归的原理**:递归是函调用自身,将问题分解为子问题。需要有递归出口(边界条件)。 - **应用**: - 递归:树遍历(二叉树)、分治算法(如快速排序)、动态规划(递归版本)。 - 递推:动态规划(迭代版本)、简单迭代计算。 - **区别**: - 递归是自上而下分解问题;递推是自下而上构建解。 - 递归可能引起栈溢出(深度大时);递推通常更高效,空间复杂度低。 - 递归代码简洁;递推需要显式循环。 数学表达式: - 例如,斐波那契列: - 递归定义:$F(n) = F(n-1) + F(n-2)$,基础情况$F(0)=0, F(1)=1$。 - 递推实现:使用组或变量累积计算。 代码示例:可以提供Python代码展示递归递推实现斐波那契列。 - 递归版本可能效率低(指级);递推版本高效(线性时间)。 回答结构: 1. **介绍**:定义递推递归。 2. **原理**:详细解释各自原理,使用数学表达式。 3. **应用**:给出实际应用。 4. **区别**:列表对比。 5. **代码示例**:展示简单示例。 6. **总结**:简要重申。 7. **相关问题**:生成几个相关问题。 确保使用中文。 生成相关问题: - 类似于示例,例如: 1. 递归据结构中的应用有哪些? 2. 如何将递归算法转换为非递归算法? 3. 递推递归在动态规划中的作用区别? 最后,引用标识:在引用参考段落末尾添加[^1]或[^2],但用户提供的引用是基于他们的输入,我需要自然地引用。如果他们提供的内容,我可以引用。 在回答中,当我提到引用中的概念时,添加[^1]或[^2]。例如,当解释递归原理时,引用[^2]。 现在,规划内容: - 原理部分: - 递归:程序调用自身,边界条件等。引用[^2]。 - 递推:基于初始值逐步推导。 - 应用: - 递归:排序算法、树遍历。 - 递推:序列计算、迭代算法。 - 区别:表格或列表形式。 - 示例:斐波那契列。 数学表达式: - 递归斐波那契:$F(n) = \begin{cases} 0 & \text{if } n = 0 \\ 1 & \text{if } n = 1 \\ F(n-1) + F(n-2) & \text{otherwise} \end{cases}$ - 独立公式用$$...$$。 代码:使用代码块展示。 完整回答框架: - 开头:你好,我将为你解释递推递归的原理、应用及区别。 - 原理: - 递归原理:函自我调用,分解问题。例如,计算阶乘:$n! = n \times (n-1)!$,基础情况$0! = 1$。 - 递推原理:使用迭代逐步计算。例如,斐波那契列从$F(0)$和$F(1)$开始计算$F(2)$、$F(3)$等。 - 应用: - 递归应用:二叉树的遍历(前序、中序、后序)。 - 递推应用:动态规划中的迭代实现。 - 区别: - 递归是自顶向下,递推是自底向上。 - 递归可能栈溢出,递推空间效率高。 - 递归代码简单,递推代码可能更复杂。 - 示例:斐波那契列的递归递推代码。 - 总结。 - 相关问题。 确保LaTeX正确:行内用$...$,独占用$$...$$。 </think>### 递推递归的原理、应用及区别 递推递归是计算机科学中两种重要的算法设计思想,它们在问题求解中各有优势。下面我将逐步解释它们的原理、应用场景以及关键区别,结合数学表达式和代码示例进行说明。回答参考了用户提供的引用资料[^1][^2],并基于计算机科学基础知识确保真实可靠。 --- #### 一、递推的原理 递推(Iteration)是一种基于迭代的算法思想,通过已知的初始状态(如初始值)逐步推导出后续状态,直到得出最终解。它的核心是使用循环结构(如 `for` 或 `while` 循环)反复执行计算,避免函调用开销。 - **数学原理**: 递推通常表现为一个序列的定义,例如斐波那契列: $$F(0) = 0, \quad F(1) = 1, \quad F(n) = F(n-1) + F(n-2) \quad \text{for} \quad n \geq 2$$ 这里,递推从 $F(0)$ 和 $F(1)$ 开始,逐个计算 $F(2)$、$F(3)$ 等值,形成自底向上的求解过程。 - **关键特点**: - 无需函调用自身,依赖显式循环。 - 空间复杂度通常较低(例如 $O(1)$ 或 $O(n)$),适合处理大规模据。 - 效率高,不易出现栈溢出问题。 #### 二、递归的原理 递归(Recursion)是一种程序调用自身的技术,将复杂问题分解为规模更小的相似子问题,直到达到边界条件(递归出口)。递归体现了“分而治之”的思想,能简化代码结构,但可能牺牲效率[^2]。 - **数学原理**: 递归问题常有明确的边界和递归关系。例如,阶乘函的定义为: $$n! = \begin{cases} 1 & \text{if } n = 0, \\ n \times (n-1)! & \text{otherwise} \end{cases}$$ 这里,$n=0$ 是边界条件,$n \times (n-1)!$ 是递归前进段。 - **关键特点**: - 需要边界条件、递归前进段(分解问题)和递归返回段(组合结果)[^2]。 - 代码简洁优雅,但递归深度大时可能引起栈溢出(空间复杂度 $O(n)$ 或更高)。 - 时间效率可能较低(如递归斐波那契为 $O(2^n)$),因此有时需转换为非递归算法优化[^1]。 #### 三、应用场景 递推递归在不同问题中各有优势。以下是常见应用: - **递归的应用**: - **树和图的遍历**:如二叉树的前序、中序和后序遍历,递归能自然表达分支结构。 ```python def inorder_traversal(root): if root: inorder_traversal(root.left) # 递归左子树 print(root.value) inorder_traversal(root.right) # 递归右子树 ``` - **分治算法**:如快速排序、归并排序,递归分解组再合并[^1]。 - **动态规划(递归版)**:如求解斐波那契列(尽管效率低)。 - **递推的应用**: - **序列计算**:如斐波那契列、阶乘的迭代实现,避免递归开销。 ```python def fibonacci(n): a, b = 0, 1 for _ in range(n): # 递推循环 a, b = b, a + b return a ``` - **动态规划(迭代版)**:如背包问题,使用组累积解。 - **值迭代**:如 Newton-Raphson 方法求解方程根。 #### 四、递推递归的区别 下表总结了主要区别(基于原理和应用): | 方面 | 递推 (Iteration) | 递归 (Recursion) | |--------------|---------------------------------------|---------------------------------------| | **求解方向** | 自底向上:从初始状态逐步推导解决。 | 自顶向下:分解为大问题到小问题。 | | **代码结构** | 使用循环(如 `for`, `while`),显式迭代。 | 函自我调用,代码简洁但隐含栈开销。 | | **效率** | 空间复杂度低(通常 $O(1)$ 或 $O(n)$),时间高效。 | 空间复杂度高(栈深度 $O(n)$),可能低效(如指时间)[^1]。 | | **适用场景** | 大规模据、需避免栈溢出的问题。 | 问题结构递归性强如树遍历、分治算法。 | | **边界处理** | 通过循环条件控制。 | 必须明确定义边界条件以防无限递归。 | #### 五、示例对比:斐波那契列 为直观理解,这里用 Python 实现斐波那契列的递归递推版本: - **递归实现**(简洁但低效): $$F(n) = \begin{cases} 0 & \text{if } n = 0 \\ 1 & \text{if } n = 1 \\ F(n-1) + F(n-2) & \text{otherwise} \end{cases}$$ ```python def fib_recursive(n): if n <= 1: # 边界条件 return n return fib_recursive(n-1) + fib_recursive(n-2) # 递归调用 ``` 当 $n$ 较大时(如 $n=40$),递归版本可能极慢($O(2^n)$)并导致栈溢出。 - **递推实现**(高效): 使用迭代逐步计算: $$F(0) = 0, \quad F(1) = 1, \quad F(k) = F(k-1) + F(k-2) \quad \text{for} \quad k=2,3,\dots,n$$ ```python def fib_iterative(n): if n <= 1: return n a, b = 0, 1 for i in range(2, n + 1): # 递推循环 a, b = b, a + b return b ``` 时间复杂度为 $O(n)$,空间为 $O(1)$,适合大 $n$。 #### 六、总结 递推递归是互补的算法范式:递推适合高效迭代计算,处理大规模问题;递归适合结构递归性强的问题,但需警惕效率问题。在实际开发中,常先用递归分析问题,再转为递推优化[^1][^2]。理解两者的原理和区别,能帮助选择合适算法。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值