递归(一)-----递归定义,力扣70爬楼梯,poj4147汉洛塔

目录

定义​

递归的基本概念

递归的工作原理

简单例子

1. 阶乘计算

2. 斐波那契数列

力扣70  ----爬楼梯

题目:

思路:

代码

poj4147 ----汉洛塔

题目 

思路 

代码 


定义​

  递归是一种在程序设计中常用的技术,它允许一个函数调用自身来解决问题。递归通常用于解决那些可以被分解为相似的子问题的问题,这些问题的解决方式具有自相似性。在数据结构和算法中,递归是一种重要的解决问题的方法,尤其是在处理树形结构和图结构时。

递归的基本概念

递归函数:一个函数直接或间接地调用自身。

基线条件:递归必须有一个或多个基线条件,以防止无限递归。基线条件通常是递归终止的简单情况。

递归步骤:递归函数调用自身时,每次调用都应该使问题更接近基线条件。

递归的工作原理

问题分解:将问题分解为更小的子问题。

递归调用:对每个子问题,递归函数调用自身。

合并结果:将子问题的解合并以形成原始问题的解。

基线条件:当问题规模足够小,可以直接解决时,停止递归。

简单例子

1. 阶乘计算

阶乘函数是一个经典的递归示例:

def factorial(n):
    if n == 0:  # 基线条件
        return 1
    else:
        return n * factorial(n-1)  # 递归调用

2. 斐波那契数列

斐波那契数列是另一个递归示例,其中每个数是前两个数的和:

力扣70  ----爬楼梯

题目:

爬楼梯. - 力扣(LeetCode)

思路:

我们用 f(x) 表示爬到第 x 级台阶的方案数,考虑最后一步可能跨了一级台阶,也可能跨了两级台阶,所以我们可以列出如下式子:

f(x)=f(x−1)+f(x−2)

它意味着爬到第 x 级台阶的方案数是爬到第 x−1 级台阶的方案数和爬到第 x−2 级台阶的方案数的和。很好理解,因为每次只能爬 1 级或 2 级,所以 f(x) 只能从 f(x−1) 和 f(x−2) 转移过来,而这里要统计方案总数,我们就需要对这两项的贡献求和。

代码

c代码实现:

int F(int n)
{
    if(n<=2)
        return n;
    else
        return F(n-1)+F(n-2);
}

python实现:

def F(n):
    if n <= 2:
        return n
    else:
        return F(n - 1) + F(n - 2)

java 实现:

public class Fibonacci {

    public static int F(int n) {
        if (n <= 2) {
            return n;
        } else {
            return F(n - 1) + F(n - 2);
        }
    }

    public static void main(String[] args) {
        // 测试函数
        int number = 10; // 例如,计算第10个斐波那契数
        System.out.println("Fibonacci of " + number + " is " + F(number));
    }
}

js实现:

function F(n) {
    if (n <= 2) {
        return n;
    } else {
        return F(n - 1) + F(n - 2);
    }
}

关于此题的其他几个解法后续出!

poj4147 ----汉洛塔

题目 

汉洛塔(Hanoi Tower)问题是一个经典的递归问题,也被称为河内塔问题。它起源于一个传说:在一个古印度的寺庙里,有三根柱子和64个金盘,这些金盘从大到小依次堆叠在一根柱子上。僧侣们的任务是将所有金盘移动到另一根柱子上,同时遵守以下规则:

1. 每次只能移动一个金盘。
2. 任何时候,一个较大的金盘不能放在一个较小的金盘上面。

解决汉洛塔问题的递归算法如下:

1. 将上面的n-1个金盘从起始柱子移动到辅助柱子,以目标柱子作为辅助。
2. 将剩下的一个最大的金盘(第n个金盘)从起始柱子移动到目标柱子。
3. 将n-1个金盘从辅助柱子移动到目标柱子,此时使用起始柱子作为辅助。

这个算法可以被递归地应用到n-1个金盘上,直到n为1,这时问题就非常简单了。

汉洛塔问题不仅是一个有趣的数学问题,也是计算机科学中用来教授递归概念的一个经典例子。
 

思路 

  1. 递归基础:首先确定递归的基本情况,即当只有一个盘子时,直接将其从起始柱子移动到目标柱子。

  2. 问题分解:将问题分解为三个步骤:

    • 将上面的n-1个盘子从起始柱子移动到辅助柱子。
    • 将最大的第n个盘子从起始柱子移动到目标柱子。
    • 将之前移动到辅助柱子的n-1个盘子移动到目标柱子。
  3. 递归调用:对于每个步骤,如果涉及到的盘子数量大于1,则递归地调用hanoi_tower函数来解决子问题。

  4. 打印移动:在递归的每一步中,打印出当前移动的盘子编号和移动的柱子。

  5. 重复过程:递归过程会重复,直到所有的盘子都被移动到目标柱子上。

  6. 计算移动次数:对于n个盘子,总共需要的移动次数是2^n - 1。这个可以通过数学归纳法证明,因为每次移动n-1个盘子后,都需要进行一次额外的移动来放置最大的盘子。

代码 

def hanoi_tower(n, source, target, auxiliary):
    if n > 0:
        # 将n-1个盘子从source移动到auxiliary,target作为辅助
        hanoi_tower(n-1, source, auxiliary, target)
        
        # 将第n个盘子从source移动到target
        print(f"Move disk {n} from {source} to {target}")
        
        # 将n-1个盘子从auxiliary移动到target,source作为辅助
        hanoi_tower(n-1, auxiliary, target, source)

# 调用函数,n为盘子数量,'A', 'B', 'C'分别为三个柱子的标识
hanoi_tower(3, 'A', 'C', 'B')

知识星球:

https://articles.zsxq.com/id_xsfrtk2w9wp6.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值