数据结构-递归(汉诺塔、斐波那契数列)

递归


递归(英语:Recursion),又译为递回,在数学与计算机科学中,是指在函数的定义中使用函数自身的方法。递归一词还较常用于描述以自相似方法重复事物的过程。例如,当两面镜子相互之间近似平行时,镜中嵌套的图像是以无限递归的形式出现的。也可以理解为自我复制的过程。

例子:
递归

汉诺塔

汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。

汉诺塔

汉诺塔实现

递归实现

递归实现思路:

  1. 先将前 n-1 个盘子移动到Y上,确保大盘在小盘下。
  2. 再将最底下的第 n 个盘子移动到Z上。
  3. 最后将Y上的 n-1 个盘子移动到Z上。
/******************************************
 * 函数名称:hanoi(int n,char x,char y,char z)
 * 功能描述:汉诺塔问题递归实现
 * 传入参数:int   n      汉诺塔的层数
 *          char  x      地一根柱子
 *          char  y      中间的柱子
 *          char  z      最右边柱子
 * 返回值:无
 * 汉诺塔:汉诺塔:汉诺塔(又称河内塔)问题是源于
 *        印度一个古老传说的益智玩具。大梵天创造
 *        世界的时候做了三根金刚石柱子,在一根柱
 *        子上从下往上按照大小顺序摞着64片黄金圆
 *        盘。大梵天命令婆罗门把圆盘从下面开始按
 *        大小顺序重新摆放在另一根柱子上。并且规
 *        定,在小圆盘上不能放大圆盘,在三根柱子
 *        之间一次只能移动一个圆盘。
 *         -|-          |           |
 *        --|--         |           |
 *       ---|---        |           |
 *     =================================
 ******************************************/
int hanoi(int n,char x,char y,char z)
{
    if(1 == n)
    {
        printf("从%c--->%c\n",x,z);
    }
    else
    {
        hanoi(n-1,x,z,y);
        printf("从%c--->%c\n",x,z);
        hanoi(n-1,y,x,z);
    }
    return 0;
}

斐波那契数列(Fibonacci)

斐波那契数列(意大利语:Successione di Fibonacci),又译为菲波拿契数列、菲波那西数列、斐氏数列、黄金分割数列。

在数学上,斐波那契数列是以递归的方法来定义公式如下:

在这里插入图片描述

用文字来说,就是斐波那契数列由0和1开始,之后的斐波那契数就是由之前的两数相加而得出。首几个斐波那契数是:
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233……

根据高德纳(Donald Ervin Knuth)的《计算机程序设计艺术》(The Art of Computer Programming),1150年印度数学家Gopala和金月在研究箱子包装对象长宽刚好为1和2的可行方法数目时,首先描述这个数列。在西方,最先研究这个数列的人是比萨的列奥那多(意大利人斐波那契Leonardo Fibonacci),他描述兔子生长的数目时用上了这数列。

假设兔子在出生两个月后,就有繁殖能力,一对兔子每个月能生出一对小兔子来。第一个月我们有一对小兔子,如果所有兔子都不死,那么每个月的兔子对数,就符合斐波那契数列。

需要满足的条件如下:

  • 第一个月初有一对刚诞生的兔子
  • 第二个月之后(第三个月初)它们可以生育
  • 每月每对可生育的兔子会诞生下一对新兔子
  • 兔子永不死去

在这里插入图片描述

斐波那契数列实现

迭代实现
/****************************************
 * 函数名称:
 * 功能描述:迭代实现斐波那契数列
 * 传入参数:int size   数列长度
 * 返回值:无
 ****************************************/
void Fibonacci_1(int size)
{
    int i = 2;
    int a[size];
    a[0] = a[1] = 1;
    printf("%d ",a[0]);
    printf("%d ",a[1]);/*前两个为1*/
    if(i >= 2)
    {
        for(i =2 ;i <= size; i++)
        {
            a[i] = a[i-1]+a[i-2];
            printf("%d ",a[i]); 
            if(i % 10 == 0)
            {
                printf("\n");
            }
        }
    }
}
递归实现
/*****************************************
 * 函数名称:Fibonacci_2(int size)
 * 功能描述:递归实现斐波那契数列
 * 传入参数:int size    数列长度
 * 返回值:斐波那契数列值
 * 斐波那契数列:0 1 1 2 3 5 8 13 21 34
******************************************/
int Fibonacci_2(int size)
{
    if(size < 2)
    {
        return size == 0 ? 0 : 1;
    }
    return Fibonacci_2(size - 1) + Fibonacci_2(size - 2);
}
/********************************************
 * 函数名称:Fib(int size)
 * 功能描述:打印斐波那契数列
 * 传入参数:斐波那契数列长度
 * 返回值:0
 ********************************************/
int Fib(int size)
{
    int i;
    for(i = 0; i < size; i++)
    {
        printf("%d ",Fibonacci_2(i));
    }
    return 0;
}

🙃
(ง •_•)ง
(。・∀・)ノ
🎈

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java 斐波那契数列实现可以使用循环或递归的方式。下面分别介绍这两种方法: 1. 使用循环实现斐波那契数列: ```java public static int fibonacci(int n) { if (n <= 1) { return n; } int prev = 0; int current = 1; int result = 0; for (int i = 2; i <= n; i++) { result = prev + current; prev = current; current = result; } return result; } ``` 在上面的代码中,我们使用循环从头开始计算斐波那契数列,直到达到指定的位置 n。 2. 使用递归实现斐波那契数列: ```java public static int fibonacci(int n) { if (n <= 1) { return n; } return fibonacci(n - 1) + fibonacci(n - 2); } ``` 在上面的代码中,我们使用递归的方式定义了斐波那契数列的计算规则。当 n 小于等于 1 时,直接返回 n;否则,递归地计算前两个数的和。 接下来,我们来看一下 Java 中汉诺塔实现: ```java public static void hanoi(int n, char source, char auxiliary, char target) { if (n == 1) { System.out.println("Move disk 1 from " + source + " to " + target); return; } hanoi(n - 1, source, target, auxiliary); System.out.println("Move disk " + n + " from " + source + " to " + target); hanoi(n - 1, auxiliary, source, target); } ``` 在上面的代码中,我们使用递归的方式实现汉诺塔问题。hanoi 方法接受四个参数:n 表示要移动的盘子数量,source 表示起始柱子,auxiliary 表示辅助柱子,target 表示目标柱子。当只有一个盘子时,直接将盘子从起始柱子移动到目标柱子;否则,将 n-1 个盘子从起始柱子通过辅助柱子移动到目标柱子上,再将最后一个盘子从起始柱子直接移动到目标柱子上。 以上就是 Java 中斐波那契数列汉诺塔实现方法。希望能对你有所帮助!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值