递归数学公式(递归公式是什么意思)
递归公式怎样推导? Pn+1-Pn=(n^2+n+2)/2 P1=2,P2=4
f(n)=P(n+1)-P(n)
显然f(1)=P(2)-P(1)=4-2=2
f(2)=P(3)-P(2)=4
f(3)=P(4)-P(3)=7
……
很明显f(2)-f(1)=2=n;
f(3)-f(2)=3=n;
所以f(n)-f(n-1)=n
--f(n)=f(n-1)+n 如果是写递归程序的话这样就够了吧,数学求P(n)的话继续,我也不知道你要什么样的数学递推公式
程序(java的):
public static int f(int n)
{
if(n==1)
return 2;
else
return f(n-1)+n;
}
然后在主函数里面调用f(n)就行了
兔子数列公式
公式如下:
一、递归公式:
a1=1;
a2=1;
a(n)=a(n-1)+a(n-2)(n=3)
二、通项公式:
a(n)=(1/√5)*{[(1+√5)/2]^n
-
[(1-√5)/2]^n}
三、证明过程:(方法:数学归纳)
1。当n=1时,a1=1,例题成立;
2。设当n=k时,命题成立,即:
a(k)=(1/√5)*{[(1+√5)/2]^k
-
[(1-√5)/2]^k}
那么,当n=k+1时,有:
a(k+1)=(1/√5)*{[(1+√5)/2]^k
-
[(1-√5)/2]^k}+
(1/√5)*{[(1+√5)/2]^(k-1)
-
[(1-√5)/2]^(k-1)}
为了写法方便,令c=(1/√5),A=(1+√5)/2,B=(1-√5)/2,于是上式为:
a(k+1)=c(A^k+A^(k-1)-B^k-B^(k-1))
=c(A^(k-1)(1+A)-B^(k-1)(1+B))
其中,1+A=A^2,1+B=B^2;(计算一下就知道了。)
于是上式为:
a(k+1)=c(A^(k+1)-B(K+1))
=(1/√5)*{[(1+√5)/2]^(k+1)
-
[(1-√5)/2]^(k+1)}
证毕。我的妈呀,累死我了,呵呵。
递推公式,数学
如果数列{an}的第n项与它前一项或几项的关系可以用一个式子来表示,那么这个公式叫做这个数列的递推公式。
如果一个数列的第n项an与该数列的其他一项或多项之间存在对应关系的,这个关系就称为该数列的递推公式。例如斐波纳契数列的递推公式为an=an-1+an-2。
等差数列递推公式:an=d(n-1)+a(d为公差?a为首项)。
等比数列递推公式:bn=q(n-1)*b (q为公比?b为首项)。
由递推公式写出数列的方法:
1、根据递推公式写出数列的前几项,依次代入计算即可。
2、若知道的是末项,通常将所给公式整理成用后面的项表示前面的项的形式。
扩展资料:
亦称递归列。由前面的项能推出后面的项的数列。指对所有np,满足形如an=f(an-1,an-2,…,an-p)的关系式的序列{an},其中f为某个函数。p是某个固定的正整数,a1,a2,…,ap为已知数。
p称为这个递推列的阶数.上述关系式称为递推公式,给定a1,a2,…,ap,可以从它得到所有an。形如an+c1an-1+c2an-2+…+cpan-p=0(c1,c2,…,cp是常数)的递推公式称为线性递推公式,相应的序列称为线性递推列。
最简单的递推列是一阶递推列,即满足an=f(an-1)的序列{an}.它又称迭代列。等差数列与等比数列都是线性的迭代列。
参考资料?百度百科-递推公式
C语言什么是递归
递归方法的概念
类方法成员间允许相互调用,也可以自己调用自己。类的方法如果在方法体内直接或间接地自己调用自己就称为递归方法。
递归基本思想就是“自己调用自己”。递归方法实际上体现了“依此类推”、“用同样的步骤重复”这样的思想,它可以用简单的程序来解决某些复杂的计算问题。
递归调用在完成阶乘运算、级数运算、幂指数运算等方面特别有效。
在执行递归操作时,C#语言把递归过程中的信息保存在堆栈中。如果无限循环地递归,或者递归次数太多,则产生“堆栈溢出”错误
例:用递归方法求阶乘。利用的数学公式为n!=n*(n-1)!。当n=0时,n!=1。
代码如下:
public long F(int n)
{
if (n==1)
return 1;
else
return n*F(n-1);
}
如何有效地确定递归公式(要求效率不能太低)
1 引言
递归程序处理的问题可以分成两类:第一类是数学上的递归函数,要求算得一个
函数值,例如阶乘函数和Fibonacci函数;第二类问题具有递归特征,目的可能是求
出满足某种条件的操作序列,例如Hanoi塔和八皇后问题。第一类问题的程序设计是
简单的、机械的,而第二类问题则不然,由于涉及面广,没有统一的规则可循,所以
编程过程往往比较复杂,而且编得的程序也不大好理解。究其原因在于,第一类问题
已经有了现成的函数公式,第二类则没有。如果我们对于第二类问题也能写出它的递
归公式,那么编码过程会大大简化,而且还可以改善程序的可读性。本文将借助两个
程序实例讨论这种方法。
2 公式化方法
程序设计可以分成两个阶段:逻辑阶段和实现阶段。逻辑阶段要确定算法,不必
考虑编程语言和实现环境。通常算法可以用自然语言、流程图、NS图等工具来表示,
对于第二类问题能在逻辑阶段得出它的递归公式,那么至少有这样几个好处:
1. 把逻辑阶段同实现阶段截然分开,大大简化程序设计。
2. 用数学方法推导递归公式,要比用其他方法设计算法要简单得多。
3. 由于公式是算法的最精确最简洁的描述形式,有了递归公式,编码工作就变得异常
简单,而且程序的可读性也会很好。
所谓递归程序设计的公式化方法,首先要把问题表示成数学意义下的递归函数,那么
关键是确定函数值的意义,尽管问题本身未必需要计算什么函数值。函数值的选取可
能不是唯一的,但是愈能表现问题本质愈好。
Hanoi塔问题要求显示为把若干个盘子从一柱搬到另一柱要采取的动作,我们可以
把动作的个数取为函数值。于是得到有四个自变量的递归函数h(d,f,t,u),其意义
是以u柱(using)为缓冲把d个盘子(disks)从f柱(from)搬到t柱(to)。容易得
到下面的递归公式:
h(1,f,t,u)=1
h(d,f,t,u)= h(d-1,f,u,t)+ h(1,f,t,u)+ h(d-1,u,t,f), 如果d1
其实际意义非常明显:搬动一个盘子只需一个动作;而把f柱上的d个盘子从f柱搬到t柱,
需要先把上面的d-1个盘子从f柱搬到u柱,再把最下面的一个盘子从f柱搬到t柱,最后
把已在u柱上的d-1盘子搬到t柱,因此总的动作个数等于三组动作之和。
有了递归公式,编程就变得极为简单。程序的结构是一个多分支结构,恰好同递归
公式一一对应,编程几乎变成了机械的翻译。在下面的程序中,递归函数与递归公式的
差别只有当d为1时不仅要把动作个数v置为1,同时还要显示此动作。
main()
{ int d,v,h(int,int,int,int);
printf("disks = ");scanf("%d",d);
v=h(d,1,2,3);
printf("\n%d actions for %d disks!\n",v,d);
}
int h(int d,int f,int t,int u)
{ int i,v;
if(d==1){v=1;printf("%d-%d ",f,t);}
else v=h(d-1,f,u,t)+h(1,f,t,u)+h(d-1,u,t,f);
return v;
}
此程序的运行会话如下:
disks = 3
1-2 1-3 2-3 1-2 3-1 3-2 1-2
7 actions for 3 disks!
3 例子:八皇后问题
八皇后问题[2]是一个更有代表性更复杂的递归例题,要求在8×8的国际象棋棋盘上摆
放8个皇后,使她们不致互相攻击。我们采取的算法仍然是从棋盘第一行开始每行放一
个皇后,对于每一行都从该行的第一列开始放置,并判断它同前面的那些皇后是否互相
攻击,如是就换成下一列,否则继续放置下一个皇后,直至放好8个皇后。依照这种思想,
我们定义一个有9个自变量的函数:
q(k,a1,a2,a3,a4,a5,a6,a7,a8)
其中k表示已放置的皇后个数,而ai(此处i=k)表示第i行上的皇后所在列的列号,因
此这9个自变量能够代表求解过程中任一时刻的状态,而函数值定义为从此状态出发能
得到的解的个数。按照这一思想不难得到下面的递归公式:
q(k,a1,...,ak,0,...0)= 0 如果有0ik,使ai同ak不相容
q(k,a1, ... , a8)= 1 如果对于任意的0i8,ai同a8都相容
q(k,a1,...,ak,0,...0)= q(k+1,a1,...,ak,1,...0)+...+q(k+1,a1,...,ak,8,...,0)
如果k8而且对于任意的0ik,ai同ak都相容
公式中的“a i和a k相容”的意思是它们不互相攻击,即逻辑表达式:
(ai-ak)(i+ai-k-ak)(i-ai-k+ak)
为真,就是说ai≠ak且i+ai≠k+aki且i-ai≠k-ak。将上面的递归公式很容易地翻译成如
下程序:
main()
{ int a[9],v,q(int,int *);
v=q(0,a);
printf("\nThere are %d solutions!\n",v);
}
int q(int k,int *a)
{ int i,u,v;
for(i=1,u=1;iku;i++)
u=u(a[i]-a[k])(i+a[i]-k-a[k])(i-a[i]-k+a[k]);
if(u==0) v=0;
else if(k==8)
{ v=1; printf("%d%d%d%d%d%d%d%d ",
a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8]);
}
else
for(i=1,v=0;i=8;i++){ a[k+1]=i;v+=q(k+1,a);}
return v;
}
递归公式中的自变量a1,…,a8是一个相关的序列,在程序中只好用数组a表示。在q( )中
首先计算ak是否同其前的所有ai相容,若是变量u非0。q( )与递归公式严格对应,呈现
出有三个选择的分支结构。在u非0且k为8的情况下,置函数值v为1,并显示已得到的
解。显然这个程序编写起来最为简单,而且最好理解。下面给出该程序的交互会话,为
节省版面只列出92个解中的4个:
15863724 16837425 ... 83162574 84136275
There are 92 solutions!
4 结束语
公式化方法是一种简单而有效的设计思想,它把程序设计和程序理解的难点都集中
到递归公式上。从上面的例子可以看到这种思想能够简化程序设计,而且得到的程序显然好于通常的程序。这种思想有普遍性,至少适用多数递归程序的设计。由递归公式设计出的程序具有标准的分支结构,编写和理解都要简单得多。
上面的两个例题在求得函数值的同时,很容易地得到了要求的序列,但对于一般的
问题未必总是这样。笔者曾给出一种伴随序列法,可以用来得到某些问题(如显示所有从m个数中取n个数的组合)要求的序列。