递归与递推深入32页PPT
- 格式:ppt
- 大小:3.85 MB
- 文档页数:32
算法总结之递推与递归递推算法递归算法⼤致包括两⽅⾯的内容:1)递归起点; 2)递归关系递推起点递归起点⼀般由题⽬或者实际情况确定,不由递归关系推出。
如果⽆法确定递归起点,那么递归算法就⽆法实现。
可见,递归起点是递归算法中的重要⼀笔。
递推关系递归关系是递归算法的核⼼。
常见的递归关系有以下⼏项:1)⼀阶递推;2)多阶递推;3)间接递推;4)逆向递推;5)多维递推。
下⾯通过栗⼦来详细介绍⼀下上述类别的递推关系。
1. ⼀阶递推在计算f(i)时,只⽤到前⾯项中的⼀项,如等差数列。
公差为3的等差数列,其递推关系为:f(i)=f(i-1)+3eg. 平⾯上10条直线最多能把平⾯分成⼏部分?分析:以直线数⽬为递推变量,假定i条直线把平⾯最多分成f(i)部分,则f(i-1)表⽰i-1条直线把平⾯分成的最多部分。
在i-1条直线的平⾯上增加直线i,易得i与平⾯上已经存在了的i-1条直线最多各有⼀个交点,即直线i最多被分成i段,⽽这i段将会依次将平⾯⼀分为⼆,即直线i将最多使平⾯多增加i部分。
所以,递推关系可表⽰为:f(i)=f(i-1)+i易得当0条直线时,平⾯为1部分。
所以f(0)=1为递推起点。
上述分析可⽤下⾯代码表⽰(c++):#define MAX 100int f[MAX] //存放f(i)int lines(int n){//输⼊n为直线数⽬//输出最多部分数int i;f(0)=1;for(i=1;i<=n;i++){f[i]=f[i-1]+3;}return f[i];}2. 多阶递推在计算f(i)时,要⽤到前⾯计算过的多项,如Fibonacci数列。
eg.求Fibonacci的第10项。
分析:总所周知,Fibonacci数列中的第n项等于第n-1项加上n-2项。
所以递推关系为f(i)=f(i-1)+f(i-2);且f[0]=f[1]=1。
C++代码如下:#define MAX 100int f[MAX];int fib(int n){//输⼊n为项数//输出第n个fib数int i;f[0]=0;f[1]=1;for(i=2;i<=n;i++){f[i]=f[i-1]+f[i-2];}return f[n]}3. 间接递推在计算f[i]时需要中间量,⽽计算中间量要⽤到之前计算过的项。
离散数学是应用数学的一个重要分支,它研究离散对象和离散结构之间的关系。
递归函数和递推式是离散数学中两个重要的概念,在解决问题和理解数学概念中起到了重要的作用。
递归函数是指定义的函数可以通过对自身的调用来实现计算的过程。
递归函数需要满足两个条件:首先,必须有一个基本情况,这个基本情况是递归函数能够直接计算出结果而不需要再递归调用;其次,递归函数必须能够将问题规模减小,使得递归函数能够趋近于基本情况。
递归函数一般采用递归调用的方式进行计算,通过多次调用最终得到结果。
递归函数的定义通常使用递归方程来表达。
递归函数的应用非常广泛。
比如在计算数列中的斐波那契数列,递归函数可以非常方便地计算当前数列项的值。
斐波那契数列的定义如下:F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2)(n≥2)。
我们可以通过递归函数来计算出任意一项的值,只需要将问题规模n减小到1时,就可以直接得到结果。
另一个例子是阶乘函数。
阶乘函数的定义是:n!=n×(n-1)!,其中0!=1。
通过递归函数的调用,我们可以直接计算出给定正整数n的阶乘值。
递推式是一种通过前一项推导出后一项的数学表达式。
递推式可以看做递归方程的一种特殊形式。
递推式的求解往往是从已知条件出发,通过逐步推导得到问题的解。
递推式的求解方法一般有两种:一种是直接法,通过简单的代入运算得到递推式的解;另一种是递推法,通过已知条件推导出递推关系式并进行逐步求解。
递推式在离散数学中的应用非常广泛,比如在解决递推关系问题、计算数列中的元素等方面都有重要的作用。
递推式的一个典型应用是求解斐波那契数列的第n项的值。
斐波那契数列的递推式是:F(n)=F(n-1)+F(n-2)(n≥2)。
通过已知条件F(0)=0,F(1)=1,我们可以逐步推导出递推关系式并进行逐步求解,最终得到第n项的值。
递推式还可以用来解决概率问题中的递推关系,比如生存概率、病毒传播概率等。
递推式在离散数学中有着广泛的应用,为解决实际问题提供了重要的数学工具。
递推与递归算法递推和递归是编程中常用的基本算法。
在前面的解题中已经用到了这两种方法,下面对这两种算法基本应用进行详细研究讨论。
一、递推递推算法是一种用若干步可重复的简单运算(规律)来描述复杂问题的方法。
[例1] 植树节那天,有五位参加了植树活动,他们完成植树的棵数都不相同。
问第一位同学植了多少棵时,他指着旁边的第二位同学说比他多植了两棵;追问第二位同学,他又说比第三位同学多植了两棵;…如此,都说比另一位同学多植两棵。
最后问到第五位同学时,他说自己植了10棵。
到底第一位同学植了多少棵树?解:设第一位同学植树的棵数为a1,欲求a1,需从第五位同学植树的棵数a5入手,根据“多两棵”这个规律,按照一定顺序逐步进行推算:①a5=10;②a4=a5+2=12;③a3=a4+2=14;④a2=a3+2=16;⑤a1=a2+2=18;Pascal程序:Program Exam1;Var i, a: byte;begina:=10; {以第五位同学的棵数为递推的起始值}for i :=1 to 4 do {还有4人,递推计算4次}a:= a+2; {递推运算规律}writeln(’The Num is’, a);readlnend.本程序的递推运算可用如下图示描述:递推算法以初始{起点}值为基础,用相同的运算规律,逐次重复运算,直至运算结束。
这种从“起点”重复相同的方法直至到达一定“边界”,犹如单向运动,用循环可以实现。
递推的本质是按规律逐次推出(计算)下一步的结果。
二、递归递归算法是把处理问题的方法定义成与原问题处理方法相同的过程,在处理问题的过程中又调用自身定义的函数或过程。
仍用上例的计算植树棵数问题来说明递归算法:解:把原问题求第一位同学在植树棵数a1,转化为a1=a2+2;即求a2;而求a2又转化为a2=a3+2; a3=a4+2; a4=a5+2;逐层转化为求a2,a3,a4,a5且都采用与求a1相同的方法;最后的a5为已知,则用a5=10返回到上一层并代入计算出a4;又用a4的值代入上一层去求a3;...,如此,直到求出a1。
递归算法和递推算法的原理-概述说明以及解释1.引言1.1 概述递归算法和递推算法是编程中常用的两种算法思想,它们都是一种问题解决的方法论。
递归算法通过将一个大问题分解为一个或多个相同的小问题来解决,而递推算法则是通过给定初始条件,通过逐步推导出后续结果来解决问题。
递归算法是一种自调用的算法,它将一个问题划分为更小规模的相同子问题,并通过调用自身来解决这些子问题。
每个子问题的解决方案被合并以形成原始问题的解决方案。
递归算法具有简洁的代码结构和易于理解的逻辑。
它在一些问题上能够提供高效的解决方案,例如树的遍历、图的搜索等。
递推算法则是从已知的初始条件开始,通过根据给定的递推公式或规则,逐步计算出后续的结果。
递推算法是一种迭代的过程,每一次迭代都会根据已知条件计算得出下一个结果。
递推算法常应用于数学问题,求解斐波那契数列、阶乘等等。
递归算法和递推算法在解决问题时的思路不同,但也存在一些相似之处。
它们都能够将大问题分解成小问题,并通过解决这些子问题来获得问题的解决方案。
而且递归算法和递推算法都有各自适用的场景和优缺点。
本文将详细介绍递归算法和递推算法的原理、应用场景以及它们的优缺点。
通过比较和分析两者的差异,帮助读者理解和选择合适的算法思想来解决问题。
1.2文章结构文章结构部分的内容可以描述文章的整体框架和各个章节的内容概要。
根据给出的目录,可以编写如下内容:文章结构:本文主要探讨递归算法和递推算法的原理及其应用场景,并对两者进行比较和结论。
文章分为四个部分,下面将对各章节的内容进行概要介绍。
第一部分:引言在引言部分,我们将对递归算法和递推算法进行简要概述,并介绍本文的结构和目的。
进一步,我们将总结递归算法和递推算法在实际问题中的应用和重要性。
第二部分:递归算法的原理在第二部分,我们将详细讨论递归算法的原理。
首先,我们会给出递归的定义和特点,探索递归的本质以及递归算法的基本原理。
其次,我们将展示递归算法在不同的应用场景中的灵活性和效果。