迭代算法与递归算法

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

     迭代算法是用计算机解决问题的一种基本方法。它利用计算机运算速度快、适合做重复性操作的特点,让计算机对一组指令(或一定步骤)进行重复执行,在每次执行这组指令(或这些步骤)时,都从变量的原值推出它的一个新值。


利用迭代算法解决问题,需要做好以下三个方面的工作:
一、确定迭代变量。在可以用迭代算法解决的问题中,至少存在一个直接或间接地不断由旧值递推出新值的变量,这个变量就是迭代变量。
二、建立迭代关系式。所谓迭代关系式,指如何从变量的前一个值推出其下一个值的公式(或关系)。迭代关系式的建立是解决迭代问题的关键,通常可以使用递推或倒推的方法来完成。
三、对迭代过程进行控制。在什么时候结束迭代过程?这是编写迭代程序必须考虑的问题。不能让迭代过程无休止地重复执行下去。迭代过程的控制通常可 分为两种情况:一种是所需的迭代次数是个确定的值,可以计算出来;另一种是所需的迭代次数无法确定。对于前一种情况,可以构建一个固定次数的循环来实现对 迭代过程的控制;对于后一种情况,需要进一步分析出用来结束迭代过程的条件。

例 1 : 一个饲养场引进一只刚出生的新品种兔子,这种兔子从出生的下一个月开始,每月新生一只兔子,新生的兔子也如此繁殖。如果所有的兔子都不死去,问到第 12 个月时,该饲养场共有兔子多少只?

 

分析: 这是一个典型的递推问题。我们不妨假设第 1 个月时兔子的只数为 u 1 ,第 2 个月时兔子的只数为 u 2 ,第 3 个月时兔子的只数为 u 3 ,……根据题意,“这种兔子从出生的下一个月开始,每月新生一只兔子”,则有
u 1 = 1 , u 2 = u 1 + u 1 × 1 = 2 , u 3 = u 2 + u 2 × 1 = 4 ,……
根据这个规律,可以归纳出下面的递推公式:
u n = u n - 1 × 2 (n ≥ 2)
对应 u n 和 u n - 1 ,定义两个迭代变量 y 和 x ,可将上面的递推公式转换成如下迭代关系:
y=x*2
x=y

让计算机对这个迭代关系重复执行 11 次,就可以算出第 12 个月时的兔子数。参考程序如下

 

例 2 : 验证谷角猜想。日本数学家谷角静夫在研究自然数时发现了一个奇怪现象:对于任意一个自然数 n ,若 n 为偶数,则将其除以 2 ;若 n 为奇数,则将其乘以 3 ,然后再加 1 。如此经过有限次运算后,总可以得到自然数 1 。人们把谷角静夫的这一发现叫做“谷角猜想”。

要求:编写一个程序,由键盘输入一个自然数 n ,把 n 经过有限次运算后,最终变成自然数 1 的全过程打印出来。

分析: 定义迭代变量为 n ,按照谷角猜想的内容,可以得到两种情况下的迭代关系式:当 n 为偶数时, n=n/2 ;当 n 为奇数时, n=n*3+1 。用 QBASIC 语言把它描述出来就是:
if n 为偶数 then
n=n/2
else
n=n*3+1
end if

这就是需要计算机重复执行的迭代过程。这个迭代过程需要重复执行多少次,才能使迭代变量 n 最终变成自然数 1 ,这是我们无法计算出来的。因此,还需进一步确定用来结束迭代过程的条件。仔细分析题目要求,不难看出,对任意给定的一个自然数 n ,只要经过有限次运算后,能够得到自然数 1 ,就已经完成了验证工作。因此,用来结束迭代过程的条件可以定义为: n=1 。参考程序如下:

 

递归是设计和描述算法的一种有力的工具,由于它在复杂算法的描述中被经常采用,为此在进一步介绍其他算法设计方法之前先讨论它。
能采用递归描述的算法通常有这样的特征:为求解规模为N的问题,设法将它分解成规模较小的问题,然后从这些小问题的解方便地构造出大问题的解,并 且这些规模较小的问题也能采用同样的分解和综合方法,分解成规模更小的问题,并从这些更小问题的解构造出规模较大问题的解。特别地,当规模N=1时,能直 接得解。
【问题】 编写计算斐波那契(Fibonacci)数列的第n项函数fib(n)。
斐波那契数列为:0、1、1、2、3、……,即:
fib(0)=0;
fib(1)=1;
fib(n)=fib(n-1)+fib(n-2) (当n>1时)。
写成递归函数有:

递归算法的执行过程分递推和回归两个阶段。在递推阶段,把较复杂的问题(规模为n)的求解推到比原问题简单一些的问题(规模小于n)的求解。例如 上例中,求解fib(n),把它推到求解fib(n-1)和fib(n-2)。也就是说,为计算fib(n),必须先计算fib(n-1)和fib(n- 2),而计算fib(n-1)和fib(n-2),又必须先计算fib(n-3)和fib(n-4)。依次类推,直至计算fib(1)和fib(0),分 别能立即得到结果1和0。在递推阶段,必须要有终止递归的情况。例如在函数fib中,当n为1和0的情况。
在回归阶段,当获得最简单情况的解后,逐级返回,依次得到稍复杂问题的解,例如得到fib(1)和fib(0)后,返回得到fib(2)的结果,……,在得到了fib(n-1)和fib(n-2)的结果后,返回得到fib(n)的结果。
在编写递归函数时要注意,函数中的局部变量和参数知识局限于当前调用层,当递推进入“简单问题”层时,原来层次上的参数和局部变量便被隐蔽起来。在一系列“简单问题”层,它们各有自己的参数和局部变量。
由于递归引起一系列的函数调用,并且可能会有一系列的重复计算,递归算法的执行效率相对较低。当某个递归算法能较方便地转换成递推算法时,通常按 递推算法编写程序。例如上例计算斐波那契数列的第n项的函数fib(n)应采用递推算法,即从斐波那契数列的前两项出发,逐次由前两项计算出下一项,直至 计算出要求的第n项。

 

【问题】 组合问题
问题描述:找出从自然数1、2、……、n中任取r个数的所有组合。例如n=5,r=3的所有组合为: (1)5、4、3 (2)5、4、2 (3)5、4、1
(4)5、3、2 (5)5、3、1 (6)5、2、1
(7)4、3、2 (8)4、3、1 (9)4、2、1
(10)3、2、1
分析所列的10个组合,可以采用这样的递归思想来考虑求组合函数的算法。设函数为void comb(int m,int k)为找出从自然数1、2、……、m中任取k个数的所有组合。当组合的第一个数字选定时,其后的数字是从余下的m-1个数中取k-1数的组合。这就将求m 个数中取k个数的组合问题转化成求m-1个数中取k-1个数的组合问题。设函数引入工作数组a[ ]存放求出的组合的数字,约定函数将确定的k个数字组合的第一个数字放在a[k]中,当一个组合求出后,才将a[ ]中的一个组合输出。第一个数可以是m、m-1、……、k,函数将确定组合的第一个数字放入数组后,有两种可能的选择,因还未去顶组合的其余元素,继续递 归去确定;或因已确定了组合的全部元素,输出这个组合。细节见以下程序中的函数comb。
【程序】

 

本文转自:http://hi.baidu.com/xiexiaohui/blog/item/180d8fb1cc2f135208230270.html

递推、迭代递归入门 阅读详情

相关推荐

详细实例说明+典型案例实现 对迭代法进行全面分析 | C++

简单的来说,算法就是用计算机程序代码来实现数学思想的一种方法。学习算法就是为了了解它们在计算机中如何演算,以及在当今的信息时代,它们是如何在各个层面上影响我们的日常生活的,从而提高我们的逻辑思维能力和处理实际问题的能力。善用算法、巧用算法,是培养程序设计逻辑的重中之重,许多实际的问题都可用多个可行的算法来解决, 但是要从中找出最优的解决算法却是一项挑战。

PIONEER 6261

递归,递推,迭代区别:

递归递推区别详解一 贪心、递归、递推以及动态规划算法的分析对比 迭代递归程序调用自身的编程技巧称为递归( recursion)。递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大

圈圈的博客 7468

迭代算法递归算法的概念及区别

迭代算法是用计算机处理问题的一种基本方法。它利用计算机运算速度快、适合做重复性操做的特点,让计算机对一组指令(或一定步骤)进行重复执行,在每次执行这组指令(或这些步骤)时,都从变量的原值推出它的一个新值。  利用迭代算法处理问题,需要做好以下三个方面的工做:  一、确定迭代变量。在能够用迭代算法处理的问题中,至少具有一个间接或间接地不断由旧值递推出新值的变量,这个变量就是迭代变量。  二、建立迭代

ChipArtist's Blogs 4万+

算法设计分析--迭代算法

穿越沙漠问题:用一辆吉普车穿越2000公里的沙漠。吉普车的总装油量为600加仑,耗油率为1加仑/公里。由于沙漠中没有油库,必须先用这辆车在沙漠中建立临时油库。该吉普车以最少的耗油量穿越沙漠,应在什么地方建油库,以及各处的贮油量。

m0_62476845的博客 7922

斐波那契数列的迭代算法递归算法

斐波那契数列:11、2、3、5、8、13...... 使用迭代算法递归算法都可以实现斐波那契数列,输出数列中的第N项,但是由于递归算法在计算时存在着大量的重复计算,所以在N值很大时,可能会造成内存的溢出,以及计算时间较长的情况出现,在使用迭代算法的情况下同样可以实现计算斐波那契数列第N项的功能,代码示例如下 迭代算法: public static int FibonacciD(int ...

sun_jinhang的专栏 3万+

递归算法迭代算法

递归算法迭代算法

weixin_73118172的博客 1376

迭代算法递归算法举例

迭代算法递归算法,以求阶乘为例。使用C语言编写示例源程序。

你好世界 1765

迭代算法递归算法的区别

【代码】迭代算法递归算法的区别。

2301_79978801的博客 353

递归算法迭代算法的区别及适用场景?

递归算法迭代算法都是计算机科学中的重要算法,它们在处理复杂问题时具有各自的优势。同时,随着技术的不断发展,这两种算法也将不断发展和完善,为计算机科学的发展提供更多的可能性。在当今信息技术飞速发展的时代,算法作为数据处理和计算的核心工具,其种类繁多,包括递归算法迭代算法递归算法适用于具有层次结构的问题,能够利用问题的层次结构特点进行求解;(3)模拟计算:在需要模拟复杂系统行为的场景中,迭代算法能够模拟问题自身的运算特点。(2)数值优化:在需要进行数值优化处理的场景中,迭代算法能够高效地解决优化问题。

searchboy2025的博客 165

Python递归算法迭代算法迭代递归分别求阶乘、斐波那契数列的代码详解

Python递归算法及树结构的定义 1.递归就是函数内部调用其他函数或它本身。 2.递归求阶乘 def factorial(n): if n == 1: return 1 else: return n * factorial(n - 1) number = int(input(‘请输入一个正数:’)) result = factorial(number) print(’%d的阶乘是:%d’ % (number,result)) ============== RESTART: F:/python-exerci

qq_40662487的博客 929

阶乘的递归迭代算法

阶乘: factorial(n)={1n<=0n∗factorial(n−1)n>0factorial(n)=\begin{cases} 1 & n<=0\\n*factorial(n-1) & n>0\end{cases}factorial(n)={1n∗fac...

weixin_30696427的博客 344

迭代算法递归算法概述

递归(recursive)的基本概念:程序调用自身的编程技巧称为递归,是函数自己调用自己。  迭代(iterative)的基本概念:利用变量的原值推算出变量的一个新值,如果递归是自己调用自己的话,迭代就是A不停的调用B。  递归迭代都是基于控制结构:迭代用重复结构,而递归用选择结构。递归迭代都涉及重复:迭代显式使用重复结构,而递归通过重复函数调用实现重复。递归迭代都涉及终止测试:迭代

kezade的blog 1454

穷举算法、递推算法迭代算法(辗转法)、递归算法

ElemSN* CreatLink3(int data[], int n) //递归法创建链表return P;递归中一定有迭代(递归函数的传入参数每次都会被递归函数处理,并赋予新值)。比如这个递归,虽然不能转换成迭代结构,但其中仍然有迭代迭代变量为n,每次在迭代过程中被处理,其结果会作为下次迭代的初始值。

m0_64363449的博客 712

二叉树的前中后序遍历的递归迭代算法

一,递归算法 二叉树的前、中、后序遍历的思路和程序都非常简单。 前中后序遍历的算法结构相同,只需要调整打印的位置。 前序遍历:打印根-访问左子树-访问右子树 中序遍历:访问左子树-打印根-访问右子树 后序遍历:访问左子树-访问右子树-打印根 ????遍历二叉树的算法中的基本操作是访问结点,所以不论是按照哪一种依次进行遍历,对有n个结点的二叉树,其时间复杂度为O(n). ????由于是该算法递归调用,所需辅助空间是遍历过程中栈的最大容量,即树的深度;一般情况下为O(logn);最坏情况下树的深度为n,则此时

qq_45043381的博客 731

[ZZ]迭代算法递归算法

原文链接:http://hi.baidu.com/xiexiaohui/blog/item/180d8fb1cc2f135208230270.html迭代算法是用计算机解决问题的一种基本方法。它利用计算机运算速度快、适合做重复性操作的特点,让计算机对一组指令(或一定步骤)进行重复执行,在每次执行这组指令(或这些步骤)时,都从变量的原值推出它的一个新值。利用迭代算法解决问题,需要做好以下三个方面的工作: 一、确定迭代变量。在可以用迭代算法解决的问题中,至少存在一个直接或间接地不断由旧值递推出新值的变量,这个变

砚的专栏 717

递归迭代算法实验解析比较

在计算1到n的累加时,递归版本会创建n层调用栈,而迭代版本只需单个循环变量。实际测试时,发现其内置的Raptor模拟器能实时显示变量变化过程,这对理解递归调用栈的变化特别有帮助。:建议设计自动化测试脚本,批量运行不同n值(如5/10/15/20)下的两种算法,记录执行时间生成对比曲线图。:建议采用树状图展示递归调用过程(如斐波那契数列的递归树),用流程图展示迭代步骤。:为准确比较算法效率,应在代码中嵌入计数器。例如在斐波那契递归算法中记录函数调用次数,在迭代版本中统计循环迭代次数,最终输出对比图表更直观。

PurpleRain89的博客 536

菲波那切数列递归迭代算法

#include <iostream> using namespace std; int Fabonaqie1(int num){ //迭代算法1 int a2 = 0; if (num == 1){ return 0; } else if(num == 2){ return 1; } else{ int a0 = 0; int a1 = 1; ...

世上的光的博客 733
上一篇: WM_DRAWITEM与DrawItem()的讨论
下一篇: 穷举法
FlowShell
博客等级 码龄17年 119粉丝 50原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值