博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
初学者看过来:简单谈谈 C/C++ 递归的思想,实现,以及和循环的关系。 (转)
阅读量:2503 次
发布时间:2019-05-11

本文共 2193 字,大约阅读时间需要 7 分钟。

初学者看过来:简单谈谈 C/C++ 递归的思想,实现,以及和循环的关系。 (转)[@more@]

 

  很多初学者往往对递归迷惑不解,也在这上面花了不少的时间。其实教材上的例子很经典,只是它说的有一些唠叨了。初学者会看的头大的。是解决问题的,而现实中很多的问题都是比较简单的,没有象汉诺塔那么复杂。我们也不必追究递归到底是怎样实现的,我们只是要会用递归,会用递归来为我们解决一些问题,这就行了。

  首先来看一个例子:

有一个Febonacci序列:

  1,1,2,3,5,8,13,,21,34........

它的问题是:求这个序列中的第N个数。

由于它的原形是:f(n)=f(n-1)+f(n-2)

这用递归很容易就可以写出代码来,一点都不费事:

  int  Febc(int n) {

  if(n<3)  return (1);

  else

  return (Febc(n-1)+Febc(n-2));

}

  噢~~~~~也许你会说递归真是太简单了,简直就是一个数学模型嘛,呵呵。

  其实,递归函数的工作过程就是自己自己。有一些问题用递归就很容易解决,简单的你自己都会吃惊。

  我们做事情,一般都是从头开始的,而递归却是从末尾开始的。比如上面的函数吧,当n>3时,它显然只能求助于n-1,n-2。而(n-1)>2,(n-2)>2时,它们就求助于:(n-1)-1,(n-1)-2;(n-2)-1,(n-2)-2;然后··············直到(n-k)<3,(n-k-1)<3时,函数Febc终于有了返回值1 了,它再从头开始计算,然后一直算到n 为止。

  通过上面的例子,我们知道递归一定要有一个停止的条件,否则递归就不知道停止了。在上面的例子中,  if(n<3)  return (1); 就是停止的条件。

  然而,使用递归的代价是十分巨大的:它会消耗大量的!!递归循环时它用的是堆栈,而堆栈的资源是十分有限的。上面的例子你只能用一个很小的n值。如果n=20,即Febc(20)的话,它将调用Febc(n)函数10000多次!!!而上面一个例子用循环也是十分容易写的:

/*using turboc2*/

int febc(int);
main()
{
  int n;
  scanf("%d",&n);
  febc(n);
}

int febc(int n)

{
  int a[3],i;
  a[0]=a[1]=a[2]=1;
  for(i=3;i<=n;i++)
  a[i%3]=a[(i+1)%3]+a[(i+2)%3];  /*实现 Febc(i)=Febc(i-1)+Febc(i-2)*/
  printf("n%dn",a[n%3]);
}

有兴趣者不妨输入一个较大的n值,然后比较比较这二个函数计算的速度。当然, 如果你使用的n太大的话,递归可能发生错误。如果死机了可别骂我哦~~~ 我已经提醒过你了 :)

  现在我们再来看看一个求从1 加到100的循环:

/*turboc2*/

main()

{  int i,n;

  for(i=1;i<101;i++)

  n+=i;  }

  这很简单没什么可说的。 但是,你能不能写出相应的递归函数呢?

  下面就是递归(请注意了,这种做法不推荐!! 我只是为了说明问题才这么写的。)

/*using Turboc2*/

int a=0;

int account(int);
main()
{
  account(100);
  printf("%d",a);
}
int account(int i)
{
  if(i==0) return 0;  /*停止条件*/
  else
  a+=account(i-1)+1; /*实现递归*/
}

  在C/C++的问题中,我曾经回答过这样的一个问题:

  若一头小母牛,从出生起第四个年头开始每年生一头母牛,按此规律,第n年时有多少头母牛? 请问如何用递归涵数求此问题?

先写出函数:f(n)=f(n-1)+f(n-3) 

为什么f(n)=f(n-1)+f(n-3)呢,请看:

f(n)-f(n-1)=f(n-3)
因为第n年要比n-1年多的牛,都是大于三岁的牛生的小牛,而f(n-3)正是那些在n年大于三岁的牛,然后它们在第n年生下相同数量的小牛。(请用BorlandC++3.1或其他C++)

#include

#include
int cattle(int,int);
void main()
{
  int ct,n;
  cout<  cin>>ct;
  cout<  cin>>n;
  cout<  getch();
}
int cattle(int ct,int n)
{
  if(n<4)  return (ct);  /*停止条件*/
  else
  return (cattle(ct,n-1)+cattle(ct,n-3));  /*实现递归*/
}

  怎么样,很简单吧。 会用循环求解吗?

  递归在实际的编程中并不常用,但是在某些情况下,它是非常强有力而漂亮的工具。掌握它的原理时会十分有用的。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10748419/viewspace-983490/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/10748419/viewspace-983490/

你可能感兴趣的文章
OCO订单(委托)
查看>>
学习笔记_vnpy实战培训day06
查看>>
回测引擎代码分析流程图
查看>>
Excel 如何制作时间轴
查看>>
股票网格交易策略
查看>>
matplotlib绘图跳过时间段的处理方案
查看>>
vnpy学习_04回测评价指标的缺陷
查看>>
ubuntu终端一次多条命令方法和区别
查看>>
python之偏函数
查看>>
vnpy学习_06回测结果可视化改进
查看>>
读书笔记_量化交易如何建立自己的算法交易01
查看>>
设计模式03_工厂
查看>>
设计模式04_抽象工厂
查看>>
设计模式05_单例
查看>>
设计模式06_原型
查看>>
设计模式07_建造者
查看>>
设计模式08_适配器
查看>>
设计模式09_代理模式
查看>>
设计模式10_桥接
查看>>
设计模式11_装饰器
查看>>