递归解析算法

本文介绍了递归的概念,强调其在计算机科学中的重要性,同时指出递归算法的优缺点。递归需要明确的结束条件,虽然简洁易懂但效率较低。文中通过递归实现斐波那契数列来举例,并探讨了兔子繁殖问题,展示了递归在解决此类问题中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.概念
  一个过程(或函数)直接或间接调用自己本身,这种过程(或函数)叫递归过程(或函数).
2.递归是计算机科学的一个重要概念,递归的方法是程序设计中有效的方法,采用递归编写
程序能是程序变得简洁和清晰.

一 、递归算法简介
在数学与计算机科学中,递归是指在函数的定义中使用函数自身的方法。
  递归算法是一种直接或者间接地调用自身算法的过程。在计算机编写程序中,递归算法对解决一大类问题是十分有效的,它往往使算法的描述简洁而且易于理解。
递归算法解决问题的特点:
  (1) 递归就是在过程或函数里调用自身。
  (2) 在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。
  (3) 递归算法解题通常显得很简洁,但递归算法解题的运行效率较低。所以一般不提倡用递归算法设计程序。
  (4) 在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等。所以一般不提倡用递归算法设计程序。在实际编程中尤其要注意栈溢出问题。

借助递归方法,我们可以把一个相对复杂的问题转化为一个与原问题相似的规模较小的问题来求解,递归方法只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。但在带来便捷的同时,也会有一些缺点,也即:通常用递归方法的运行效率不高。

public int Digui(int n)
{
int result;
if (n1)
{
result = 1;
}
else if (n
2)
{
result = 1;
}
else
{
result = Digui(n - 1) + Digui(n - 2);
}
return result;
}
兔子繁殖问题
斐波那契数列又因数学家列昂纳多•斐波那契以兔子繁殖为例子而引入,故又称为“兔子数列”。
一般而言,兔子在出生两个月后,就有繁殖能力,一对兔子每个月能生出一对小兔子来。如果所有兔子都不死,那么一年以后可以繁殖多少对兔子?
我们不妨拿新出生的一对小兔子分析一下:
第一个月小兔子没有繁殖能力,所以还是一对
两个月后,生下一对小兔对数共有两对
三个月以后,老兔子又生下一对,因为小兔子还没有繁殖能力,所以一共是三对
------
依次类推可以列出下表:
经过月数 0 1 2 3 4 5 6 7 8 9 10 11 12
幼仔对数 1 0 1 1 2 3 5 8 13 21 34 55 89
成兔对数 0 1 1 2 3 5 8 13 21 34 55 89 144
总体对数 1 1 2 3 5 8 13 21 34 55 89 144 233
幼仔对数=前月成兔对数
成兔对数=前月成兔对数+前月幼仔对数
总体对数=本月成兔对数+本月幼仔对数
可以看出幼仔对数、成兔对数、总体对数都构成了一个数列。这个数列有关十分明显的特点,那是:前面相邻两项之和,构成了后一项。
这个数列是意大利中世纪数学家斐波那契在<算盘全书>中提出的,这个级数的通项公式,除了具有a(n+2)=an+a(n+1)的性质外,还可以证明通项公式为:an=(1/√5)*{[(1+√5)/2]n-[(1-√5)/2]n}(n=1,2,3…)

  1. 1、1、2、3、5、8、13、21、34、……
    2.有一对雌雄兔,每两个月就繁殖雌雄一对兔子.问n个月后共有多少对兔子
    3.已知:数列1,1,2,4,7,13,24,44,…求数列的第 n项.

2.有一对雌雄兔,每两个月就繁殖雌雄一对兔子.问n个月后共有多少对兔子
#include

using namespace std;
int tuziwenti(int n)
{
int m=2;//tuzishuliang
if(n/2 ==0)
m =2;
else
{

    m = tuziwenti(n-2)*2;
}
return m;

}

int main(int argc, char *argv[])
{

cout << tuziwenti(8) << endl;
return 0;

}

3.已知:数列1,1,2,4,7,13,24,44,…求数列的第 n项.
#include

using namespace std;
int shuzuwenti(int n)
{
int m;

  if(n==3)
  {
    m=2;

  }
  else if(n==2)
  {
     m=1;
  }
  else if(n==1)
  {
      m=1;
  }
  else
  {
       m=shuzuwenti(n-1)+shuzuwenti(n-2)+shuzuwenti(n-3);

  }
  return m;

}

int main(int argc, char *argv[])
{

cout<<shuzuwenti(5)<<endl;


return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值