有关于递归函数的一些学习记录(Recursion)走楼梯,递归找出最两个数的大公约数,汉诺塔问题


递归函数的定义是指在函数执行的过程中,在函数体中直接或间接的调用了自己,这样的函数就是递归函数。递归函数的使用使得分而制之(Divide and Conquer)的思想得意实现,并在解决循环和一些复杂的求解问题中显示了很好的作用。


问题一:说,一个人在爬一个楼梯时,一次可以走一个台阶也可以走两个台阶,问这个人走到第九个台阶有多少种走法?

这是我在2013年春参加南京大学计算机系研究生复试的时候,被问到了这样一个问题,

如果我们不能用递归的思想来解决此类问题的话,这类问题的复杂程度可想而知。若我们理清思路,可得:

当楼梯为第 n=1层时,只有1种走法;当n=2层时,会有两种走法;

所以 f(1)=1;f(2)=2;

而当一个人处于第n层时,它可由第n-1层用一 步迈上去,也可以由第n-2层,1步迈两层上去。所以 f(n)=f(n-1)+f(n-2);

这里可能会有人疑问说,当位于第n-2层时不是由两种迈步的方法吗?要明白的是,当用户在第n-2层只迈一步的时候调到第n-1层,这是f(n-1)里面的问题了,故走到第n层的走法就是走到第n-1层加上第n-2层的走法所以

f(n)=f(n-1)+f(n-2);然后用递归函数就解出来了,这里给出函数的实现。这个问题的原形页就是fibonacci的实现问题。

int step(int n)
{
	
	if(n==1||n==2)
		return n;
	else
		return  step(n-1)+step(n-2);
}
问题二:如何用递归实现求两个数的最大公约数问题。

两个数的最大公约数就是可以同时整除这两个数的最大的约数,一般的求法是找到这两个数(设为X,Y)的较小的一个值并赋值给一个变量temp,然后temp依此减小一,直到可以同时被X,Y整除,这里通过循环很容易就可以实现。

下面来介绍怎样通过递归来实现:

根据经典的欧几里得算法也称作(辗转相除算法)两个正整数(a,b)假如a<b,的最大公约数c也是b%a与a的最大公约数,因为b=(b/a)*a+b%a,所以若a和b%a均可整除c,则(b/a)*a也可整除c,从而b也可整除c.又c是a的最大约数,则c也是a和b的最大公约数,所以通过辗转相除可实现递归算法:

int getcd(int a ,int b)
{
	return (b==0)?a:getcdd(b,a%b);
}

问题三:汉诺塔问题
汉诺塔的具体情形就不描述了,这里主要讲述思想:
(1)当 n=1时,只需将盘子从A->B.
但n>1时,进行如下的分解:
(1)将n-1个盘子从A->C;
(2)将第n个盘子从A->B;
(3)将n-1个盘子从C->B;
所以看到汉诺塔问题也被我们分解成了小问题,并一步一步分解,知道最后只有一个盘子后然后递归即可,注意这里需要改变参数的位置来改变移动的方向。
void hanoi(char x,char y,char z,int n)
{
	if(n==1)
		cout<<"1:"<
    
    
     
     <<"->"<
     
     
      
      <
      
      
       
       "<
       
       
        
        <
        
        
       
       
      
      
     
     
    
    





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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值