递归和递推都是算法设计中的难点,算法又十分相近,很多和我一样学生误认为是一回事,非常容易混淆。其实它们之间既有相似点,又有明显的区别。
递推一般用循环来解决,从已知条件到未知逐渐接近结果;
(1)将复杂运算分解为若干重复的简单运算
(2)后一步骤建立在前一步骤之上
(3)计算每一步骤的方法相同
(4)从开始向后计算出结果
(5)使用循环结构,通过多次循环逐渐逼近结果
递归一般自己调用自己,从未知到已知,把规模大的、较难解决的问题变成规模较小的、易解决的同一问题。规模较小的问题又变成规模更小的问题,并且小到一定程度可以直接得出它的解,从而得到原来问题的解。
(1)每一次递归都缩小问题规模,直到问题足够小
(2)使用选择分支语句
(3)从后往开始逐步逼近
(4)达到最开始,再把初始值带入往后逐一求解
下面通过例子逐个介绍。
递推:
一。 解阶乘 n! = 1*2*3*4*....*(n-1)*n.
fun(int n)
{
long s=1;
int i;
for(i=1;i<=n;i++)
s=s*i;
return s;
}
二。捕鱼问题
A,B,C,D,E五个渔夫夜间合伙捕鱼,,第二天清A先醒来,他把鱼均分五份,把多余的一条扔回湖中,便拿了自己的一份回家了,B醒来后,也把鱼均分五份,把多余的一条扔回湖中,便拿了自己的一份回家了,C,D,E也按同样方法分鱼。问5人至少捕到多少条鱼?
这也是一个递推问题,递推关系式为 F(n+1) = F(n)*5/4+1 (i = 1,2,3,4) F(5)即捕鱼的总数
#include
int main()
{
int i, n, f[5], flag;
flag = 1;
n = 1;
while (flag == 1)
{
f[0] = 5*n+1;
flag = 0;
for (i=1; i<5; i++)
{
if (f[i-1]%4!=0)<