数据结构之递归(Recursion)------分而治之

1.递归的定义
在定义一个过程或函数时出现调用本过程或本函数的成分,称之为递归。
直接递归:函数调用自身。
间接递归:过程或函数p调用过程或函数q,而q又调用p。
尾递归:一个递归过程或递归函数中递归调用语句是最后一条执行语句。尾递归只是一个变形的循环,可以很容易用循环来代替。在含有循环结构的语言中,不推荐使用尾部递归。

例如阶乘函数的定义: 在该函数fun(n)求解过程中,直接调用fun(n-1)(语句4)自身,所以它是一个直接递归函数。又由于递归调用是最后一条语句,所以它又属于尾递归。

    public int fun(int n) {          
        if (n == 1) return 1;
        else return fun(n - 1) * n;         
    }
  public int fun(int n) {
        int result = 1;
        for (int i = 1; i <= n; i++)
            result *= i;
        return result;
    }

2.递归是如何实现的
2.1递归调用不是表面上的函数自身调用,而是一个函数的实例调用同一个函数的另一个实例(是两个不同的实例)
2.2函数调用的过程中处理要素包括:函数控制权的转接工作(利用函数入口地址和返回地址),局部变量的空间分配工作,实参和形参的传递,函数的返回结果传递。

3.何时使用递归
1. 定义是递归的(数学公式、数列等的定义)
2. 数据结构是递归的 (单链表就是一种递归数据结构 sum函数)
3. 问题的求解方法是递归的
eg:1.有三根杆子A,B,C。A杆上有若干碟子
   2.每次移动一块碟子,小的只能叠在大的上面
   3.把所有碟子从A杆全部移到C杆上
解:题中只给了三座塔,我们利用C塔将圆盘堆在B塔。首先将A塔的1号圆盘放在B塔,A塔的2号圆盘放在C塔,再把放在B塔的1号圆盘放在C塔,此时C塔拥有两个圆盘按要求自下而上从小到大排列。接下来将A塔的3号圆盘放在B塔,将C塔的1号圆盘放在B塔,把C塔德2号圆盘放在A塔,再把B塔的1号圆盘放在A塔,此时C塔空,1号2号按要求排在A塔,B塔只有3号圆盘。此时把B塔3号圆盘放在C塔,把A塔德1号放在B塔吗,把A塔德2号房在C塔,再把B塔德1号放在C塔,此时B塔空,C塔按要求排有123号圆盘。这次把A塔的4号圆盘放在B塔,这次就比较麻烦了先把C塔的1号放在A塔,C塔的2号房在B塔,再把A塔德1号放在B塔,把C塔德3号放在A塔,再把B塔的1号放在C塔,把B塔德2号放在A塔,再把C塔德1号放在A塔,此时C塔空,B塔只有4号圆盘,A塔按要求房有123到N号圆盘,缺4号圆盘。现在把B塔的4号圆盘房在C塔,现在推回去,把A塔德1号房在C塔,A塔的2号房在B塔,再把C塔的1号放在B塔,把A塔德3号房再C塔,此时刚好是3号压4号于C塔,再把,B塔的1号房在A塔,把C塔的2号放在C塔,把A塔的1号放在C塔,这下刚好推回来,此时B塔空,A塔最上面是5号圆盘,C塔按要求放有1234号圆盘。 按这样的递推方法,将n-1个圆盘按要求放在C塔,第n个圆盘放在B塔,现在A塔空。n号圆盘是最大的圆盘,按问题要求我们终于把n号最大的圆盘放在了B塔,这下借助已空的A塔联合BC塔推回来,就可以把n个圆盘按要求放在B塔。

public class Recursion {

    public void move(int n, char a, 
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值