第一次投稿《初学递归函数的感想》

本文记录了作者初次学习递归函数的心得体会,从简单的阶乘函数开始,深入到解决汉诺塔问题,探讨递归在编程中的应用及其优势。递归在解决汉诺塔问题时展现出的简洁性和可读性让作者深感其魅力,同时也意识到理解和掌握递归函数的复杂性。
摘要由CSDN通过智能技术生成

  此文完全是为了投稿。。。

 

                          初学递归函数的感想

09软件一班邱鑫

指导:08软件三班 李劲

  作为大一新生并且刚学函数不久,笔者实在没有资格妄谈编程的算法与思想,不过也许留下此刻的学习感悟或许在日后在浩繁的语法、逻辑中困惑迷茫时起返璞归真之效(这个想法是为高中学习经验),遂记之。

  教材《C++程序设计》中关于函数的递归调用的例题为:用递归方法求n!其递归函数int fac(int n)代码为:

  Int f;

  If(n<0)

{cout<<”n<0,data error!”<<endl;f=-1;}

else if(n==0 || n==1) f=1;

else f=fac(n-1)*n;

return f;}

这个函数的功能很明显,当输入的n小于0时报错(返回-1实现),n01时返回1,而n大于1时便调用facn-1*n。显然n!=n*(n-1)!,由此可见当n为大于1的值时,函数正在实现一个循环过程直到n1。那么,笔者根据这个思想写出了用循环解决的函数。

long f=1,p;

 while(n>1)

 {

      p=n*(n-1);

      f=p*f;

      n=n-2;

 }

 return f;

由此可见,递归在某些时候相比循环大大增加了可读性,对写代码的人而言也减少了思维强度。实际上递归可以分成两个部分,一是递归调用,二是出口,其相当于循环中的算法和循环条件。所以,当老师讲完这节时,笔者们都觉得递归很容易,直到遇到汉诺塔的问题,我对递归有了新的理解。

  汉诺塔问题大意为三个座ABCA座上有n个盘子,小的在上大的在下,要求把这些盘子从A座移到C座,每次只允许移动一个盘子并且始终保持3个座上大盘在下,小盘在上,移动过程中可以利用B座,打印出移动步骤。

  当时笔者尚未意识到这是一个递归问题,总是考虑用循环解决(事实上循环确可以实现),但是总被各种问题困扰。直到别提示可用递归思想,才恍然大悟。

  盘子的移动过程实际上不断重复这步:

  把上面n-1个盘子通过C盘移动到B盘。

  把剩下的最大的盘子直接移到C盘。

  B盘的n-1个盘子通过A盘移动到C盘。

这个③步骤大家可能注意到了,如何实现把这n-1个盘子从B转移到C呢?注意笔者的用词,【通过】A座【移动】到C座,而完成这一步的工作实质上又是把(n-1)-1个盘子【通过】A【移动】到C,再把这n-1个盘子中的最大者直接移到C,循环于焉形成了!这样直到……

  直到n减到几的时候?我们发现n2时,依然是把2-1个盘子通过AB移到C,再把最后一个盘子移到C。由此可见,出口即为n==1时的情况。

  这个循环的过程即为“通过*移动到*,剩下最大的盘子直接移动到C”的重复,由此,用递归函数解决汉诺塔的大概思路业已形成。那么我们来看下实现循环功能的函数代码(由于时间关系,此代码为网上摘抄,“//”后为笔者注)吧。

  void move(char getone,char putone)//输出盘子的移动过程

{     cout<< getone <<"-->"<<putone<<endl; }

void hanoi(int n,char one,char two,char three)

{  

    if (n==1) move (one,three);//最大的盘子显然应是从A座移到C

    else

    {   hanoi (n-1,one,three,two);//n-1个在A座的盘子通过C座而移动到B

        move(one,three);        

        hanoi(n-1,two,one,three);//已经被移动到B座的n-1个盘子通过A座移动到C

    }

}

 这是程序中输入4之后的效果

 

  看来,对于我们初学编程者来说,递归并非求n!那样简单。通过这个汉诺塔问题笔者发现,递归的过程可以不需要对全局过程完全掌握,如此说或许有些不合适,但笔者确是在被提示使用递归思想后写出代码,但若实践这一汉诺塔问题,尤其是n较大时,恐怕便力不从心。而在这个递归函数中,关键是如何实现“通过”“移动”的过程,事实上我们发现,实现它仅仅需要if (n==1) move (one,three)这个出口,操作步骤?忽略!

  由此笔者想到“面向对象”这一名词,虽然它到底是什么含义笔者不清楚,但从字面看递归确是实现了“简化过程,直面对象”的过程,递归里还有无限的奥妙,让我们共同去探索吧!

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值