递推法的特点:(用for循环推导)
递推法的核心在于找到递推关系式。这种方法可以将复杂的计算过程转化为简单的重复步骤。充分利用计算机在运行过程的时间局部性和空间局部性。
递推法的思想:
- 首先找到各个相邻数据项的递推关系。
- 递推关系避开了求通项公式的麻烦,尤其是对于难以理解和无法求解通项公式的题目。
- 将复杂的问题分解成若干个简单运算。
- 一般说,递推算法可以视为一种特殊的迭代算法
- 例题斐波纳契数列fibonacci问题
斐波那契数列(Fibonaccisequence),又称黄金分割数列,因数学家莱昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”。
指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、...
在数学上,斐波那契数列以如下被以递推的方法定义:F(0)= 0,F(1) =1, F(n)= F(n-1)+F(n -2) (n ≥ 2, n ∈N*)请求出该数列中第n个数字(n从1开始计数)是多少。import java.util.Scanner; public class Main { //1.确定数据项,找到符合要求的递推式 //2.根据递推式设计递推程序(for循坏) //3.根据题目找到递推的终点 //4.单次查询不存储,多次查询要存储 /*斐波纳契数列fibonacci问题 斐波那契数列(Fibonaccisequence),又称黄金分割数列,因数学家莱昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”。 指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、... 在数学上,斐波那契数列以如下被以递推的方法定义:F(0)= 0,F(1) =1, F(n)= F(n-1)+F(n -2) (n ≥ 2, n ∈N*)请求出该数列中第n个数字(n从1开始计数)是多少。*/ public static void main(String[] args) { //递推关系式: 当你>=2时递推关系式 F(n)= F(n-1)+F(n -2) (n ≥ 2, n ∈N*) //F(0)= 0,F(1) =1, ↓ int n;//第n个数 后一个数等于前两个数的和=F(n+2)=F(n)+F(n+1) int x=0;//F(n) 初始化相当于F(0)=0 //=ans=x+y int y=1;//F(n+1) 初始化相当于F(1)=1 int ans=0;//F(n+2) 可以用递推式,所以初始化=0 Scanner in=new Scanner(System.in); n=in.nextInt(); if(n==0) { ans=0; }else if(n==1) { ans=1; }else { for(int i=2;i<=n;i++) { ans=x+y;//i+1,x,y和ans同样也往后移一位 x=y; y=ans; } } System.out.println(ans); } }
题目描述:
斐波那契数列(Fibonaccisequence),又称黄金分割数列,因数学家莱昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称数列"。
指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、...
在数学上,斐波那契数列以如下被以递推的方法定义:F(0)= 0,F(1) = 1. F(n) = F(n-1)+F(n-2) (n ≥ 2, n ∈ N*)
我们将进行M次查询,每次输入一个N,其中n小于30。请求出该数列中第n个数字(n从1开始计数)是多少?import java.util.Scanner; public class test { //1.确定数据项,找到符合要求的递推式 //2.根据递推式设计递推程序(for循坏) //3.根据题目找到递推的终点 //4.单次查询不存储,多次查询要存储 static int [] F=new int [35]; static void init() {//定义函数,用于存储斐波那契数列 F[0]=0; F[1]=1; for(int i=2;i<=30;i++) { F[i]=F[i-1]+F[i-2]; } } public static void main(String[] args) { /* 题目描述: 斐波那契数列(Fibonaccisequence),又称黄金分割数列,因数学家莱昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称数列"。 指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、... 在数学上,斐波那契数列以如下被以递推的方法定义:F(0)= 0,F(1) = 1. F(n) = F(n-1)+F(n-2) (n ≥ 2, n ∈ N*) 我们将进行M次查询,每次输入一个N,其中n小于30。请求出该数列中第n个数字(n从1开始计数)是多少? */ int m;//查询m次 int n;//第几个数字 Scanner in=new Scanner(System.in); m=in.nextInt(); init(); while(m>0) {//用于循环输入n m=m-1; n=in.nextInt(); System.out.println(F[n]);//输入多少次n,输出多少次F[n] } } }