斐波那契数列的两种思路

本文介绍了动态规划的基本概念,将其与决策过程联系起来,并通过斐波那契数列示例展示递归的应用。还对比了递归和动态规划在时间复杂度上的差异,以及提供了相应的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.什么是动态规划
二.什么是递归
三.递归和动态规划的区别
四.举例:斐波那契数列

一.什么是动态规划

1.动态规划

        概述:动态规划是运筹学的一个分支,是求解决策过程最优化的过程

        大白话解释: 是个求解最优 解决方案 的过程

我们从上述这句话中看到一个新名词,叫做决策过程.那么什么是决策过程呢?

2.决策过程:

        概述:决策过程是从提出问题,确定目标开始,经过方案选优、作出决策、交付实施为止的全部过程。

        大白话解释:从 发现问题 到 制定方案 和 解决问题 的过程

        

        举例说明:

        (1)发现问题:小黄有点胖

        (2)制定问题方案:每天做俯卧撑100个

        (3)实施方案:每天去做俯卧撑100个

在我们了解了动态规划的一些基本含义后,我们再来复习一下 递归 的含义

二.什么是递归

1.递归:

        概述:在计算机科学中是指一种通过重复将问题分解为同类的子问题而解决问题的方法。

        大白话解释:指的是函数在执行过程中自己调自己的一种行为

2.用递归解决斐波那契数列

          斐波那契数列题目:

          (1) 一对小兔子, 1个月之后会长成1对大兔子.        

          (2) 每对大兔子, 每个月都会生1对小兔子.        

          (3)假设所有兔子都不死的情况的, 问: 1对小兔子, 1年之后会变成多少对兔子?

        

   分析如下:

我们都知道,递归要找到出口和规律,由我们的分析可以得出以下结论:

        

# 1. 定义函数.
import time

def get_rabbit(month):
    """
    该函数用于计算 每月的兔子对数
    :param month: 要计算兔子对数的 月份
    :return: 该月的兔子总对数
    """
    # 出口, 前两个月的兔子对数 = 1
    if month == 1 or month == 2:
        return 1

    # 规律, 从第3个月开始, 每月的兔子对数 = 上月兔子对数 + 上上月兔子对数
    return get_rabbit(month - 1) + get_rabbit(month - 2)

# 2. 调用函数.
if __name__ == '__main__':
    start_time = time.time()
    print(get_rabbit(30))
    end_time = time.time()
    elapsed_time = end_time - start_time
    print(f'递归执行时间为{elapsed_time}')

三.递归和动态规划的区别

时间复杂度不同

动态规划代码:

 start_time = time.time()
    num_list = [1, 1]
    # 索引:      0  1  2 .....    11(刚好是第12个月)

    # 2. 遍历, 往列表中添加元素, 规律是: 当前数字 = 前两个数字之和.
    for i in range(2, 30):      # 包左不包右, 即: 2 ~ 30, 分别表示 3 ~ 30月
        # 计算当前月的兔子对数, 并添加到列表中.
        rabbits = num_list[i - 1] + num_list[i - 2]
        num_list.append(rabbits)

    # 3. 打印结果.
    print({num_list[-1]})
    end_time = time.time()
    elapsed_time = end_time - start_time
    print(f'动态规划执行时间为{elapsed_time}')

        

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值