【C++】函数计算题解论


在这里插入图片描述

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳]
本文专栏: C++

文章目录

  • 💯前言
  • 💯题目描述
  • 💯思路解析
    • 3.1 函数的递归定义
    • 3.2 边界条件控制
    • 3.3 记忆化搜索
  • 💯C++实现代码
  • 💯添加解释
  • 💯小结


在这里插入图片描述


💯前言

  • 在编程演练中,递归记忆化算法是解决复杂问题的重要工具。特别是对于大规模动态规划问题,递归算法通过问题分解实现小问题的求解,而记忆化算法则是其性能优化的重要手段。本文将对一道基于递归和记忆化的函数计算题目进行全面解论,通过完整的思路解析代码讲解,帮助研究生提升对递归与动态规划问题的理解深度和实现能力。
    C++ 参考手册
    在这里插入图片描述

💯题目描述

有一个数列,函数定义如下:

f ( n ) = f ( n − 1 ) + f ( n / / 2 ) + f ( n / / 3 ) f(n) = f(n-1) + f(n//2) + f(n//3) f(n)=f(n1)+f(n//2)+f(n//3)

其中:

  • n//m表示正整除法。例如:3//2 = 1,4//2 = 2,5//2 = 2。
  • 边界条件: 当 n ≤ 0 n \leq 0 n0 ,有 f ( n ) = 0 f(n) = 0 f(n)=0
  • 现在告诉你 f ( 1 ) = x f(1) = x f(1)=x,请计算 f ( n ) f(n) f(n) 的值。

输入描述
输入两个整数 x x x n n n

  • 0 < x 0 < x 0<x n ≤ 20 n \leq 20 n20

输出描述
输出 f ( n ) f(n) f(n) 的值。

示例1

  • 输入:
    1 6
    
  • 输出:
    16
    

题目提示

  • f ( 1 ) = 1 f(1) = 1 f(1)=1
  • f ( 2 ) = f ( 1 ) + f ( 1 ) + f ( 0 ) = 1 + 1 + 0 = 2 f(2) = f(1) + f(1) + f(0) = 1 + 1 + 0 = 2 f(2)=f(1)+f(1)+f(0)=1+1+0=2
  • f ( 3 ) = f ( 2 ) + f ( 1 ) + f ( 1 ) = 2 + 1 + 1 = 4 f(3) = f(2) + f(1) + f(1) = 2 + 1 + 1 = 4 f(3)=f(2)+f(1)+f(1)=2+1+1=4
  • f ( 4 ) = f ( 3 ) + f ( 2 ) + f ( 1 ) = 4 + 2 + 1 = 7 f(4) = f(3) + f(2) + f(1) = 4 + 2 + 1 = 7 f(4)=f(3)+f(2)+f(1)=4+2+1=7
  • f ( 5 ) = f ( 4 ) + f ( 2 ) + f ( 1 ) = 7 + 2 + 1 = 10 f(5) = f(4) + f(2) + f(1) = 7 + 2 + 1 = 10 f(5)=f(4)+f(2)+f(1)=7+2+1=10
  • f ( 6 ) = f ( 5 ) + f ( 3 ) + f ( 2 ) = 10 + 4 + 2 = 16 f(6) = f(5) + f(3) + f(2) = 10 + 4 + 2 = 16 f(6)=f(5)+f(3)+f(2)=10+4+2=16

通过此样例,可以看出, f ( n ) f(n) f(n)的值根据归约式进行递归计算,重复调用是此算法的重点。


💯思路解析

该题目的核心在于通过递归和记忆化算法实现函数计算。根据题目定义,我们可以将问题分解为以下步骤:


3.1 函数的递归定义

f ( n ) f(n) f(n) 的值由三部分经结而成:

  • f ( n − 1 ) f(n-1) f(n1):下一个数值的递归计算;
  • f ( n / / 2 ) f(n//2) f(n//2):正整除的结果解析;
  • f ( n / / 3 ) f(n//3) f(n//3):正整除法分解的值。

这三者求和即可实现函数的递归结果。


3.2 边界条件控制

  • n ≤ 0 n \leq 0 n0 时,给出结果 f ( n ) = 0 f(n) = 0 f(n)=0,停止递归求和。
  • n = 1 n = 1 n=1 时,固定值 f ( 1 ) = x f(1) = x f(1)=x

3.3 记忆化搜索

在递归过程中,同样的函数值可能被重复计算。为了提高系统性能,通过存储计算结果实现记忆化,可以大大减少计算时间。


💯C++实现代码

#include <iostream>
using namespace std;

int x, n;
int memo[21]; // 因为n≤20,开数组即可。-1表示未计算。

int f(int m) {
    if (m <= 0) return 0;          // 边界条件:f(0)=0
    if (m == 1) return x;          // 特殊情况:f(1)=x
    if (memo[m] != -1) return memo[m]; // 如果已经计算过,直接返回
    memo[m] = f(m-1) + f(m/2) + f(m/3); // 递归定义f(m)
    return memo[m];
}

int main() {
    cin >> x >> n;
    for (int i = 0; i <= 20; i++) memo[i] = -1; // 初始化memo数组
    cout << f(n) << endl;         // 输决f(n)
    return 0;
}

在这里插入图片描述


💯添加解释

  1. 算法核心:递归与记忆化

    • 递归实现大问题的分解,通过建立子问题的依赖关系逐步求解。
    • 记忆化通过存储中间计算结果,减少重复调用,优化时间复杂度。
  2. 时间复杂度分析:

    • 由于记忆化的存在,每个状态最多仅被访问一次,因此时间复杂度为 O ( n ) O(n) O(n)
    • 空间复杂度取出于递归深度和存储数组,为 O ( n ) O(n) O(n)
  3. 应用扩展:

    • 该方法不仅限于此类问题,还可推应到分治法、斐波那契数列、树式DP等递归与动态规划问题。

💯小结

  • 在这里插入图片描述
    本文通过对递归与记忆化算法的分析和 C++ 实现,给出了解决函数计算问题的优化思路。递归的分解记忆化存储在进阶算法学习中具有重要的实际价值,它们是解决动态规划算法问题的基础。此外,大规模复杂问题也可以通过该思路求解,例如并行递归动态应用等部分优化方案。

在这里插入图片描述


在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/939709.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

低温高海拔大载重无人机吊运技术详解

低温高海拔大载重无人机吊运技术是一项复杂而先进的技术&#xff0c;它结合了无人机的飞行控制、吊装系统的操作以及特殊环境下的适应性等多个方面。以下是对该技术的详细解析&#xff1a; 一、无人机基础知识与结构特点 低温高海拔大载重无人机通常采用旋翼设计&#xff0c;…

Java设计模式 —— 【结构型模式】适配器模式(类的适配器、对象适配器、接口适配器)详解

文章目录 基本介绍一、类的适配器二、对象适配器三、接口适配器总结 基本介绍 生活中有很多例子&#xff1a; 不同国家的插座接口不同&#xff0c;需要转换器&#xff1b;家用电源220V&#xff0c;手机只接受5V充电&#xff0c;需要转换器&#xff1b;读卡器&#xff0c;拓展…

系列2:基于Centos-8.6Kubernetes 集成GPU资源信息

每日禅语 自省&#xff0c;就是自我反省、自我检查&#xff0c;自知己短&#xff0c;从而弥补短处、纠正过失。佛陀强调自觉觉他&#xff0c;强调以达到觉行圆满为修行的最高境界。要改正错误&#xff0c;除了虚心接受他人意见之外&#xff0c;还要不忘时时观照己身。自省自悟之…

leetcode17:电话号码的字母组合

给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下&#xff08;与电话按键相同&#xff09;。注意 1 不对应任何字母。 示例 1&#xff1a; 输入&#xff1a;digits "23" 输出&#…

OpenHarmony-3.HDF Display子系统(6)

Display 子系统 1.Display驱动模型介绍 当前操作系统和 SOC 种类繁多&#xff0c;各厂商的显示屏器件也各有不同&#xff0c;随之针对器件的驱动代码也不尽相同&#xff0c;往往是某一款器件驱动&#xff0c;只适用于某单一内核系统或 SOC&#xff0c;如果要迁移到其他内核或者…

AQS源码学习

一、park/unpark阻塞唤醒线程 LockSupport是JDK中用来实现线程阻塞和唤醒的工具。使用它可以在任何场合使线程阻塞&#xff0c;可以指定任何线程进行唤醒&#xff0c;并且不用担心阻塞和唤醒操作的顺序&#xff0c;但要注意连续多次唤醒的效果和一次唤醒是一样的。JDK并发包下…

GUI07-学工具栏,懂MVC

MVC模式&#xff0c;是天底下编写GUI程序最为经典、实效的一种软件架构模式。当一个人学完菜单栏、开始学习工具栏时&#xff0c;就是他的一生中&#xff0c;最适合开始认识 MVC 模式的好时机之一。这节将安排您学习&#xff1a; Model-View-Controller 模式如何创建工具栏以及…

C++----类与对象(中篇)

引言 以C语言栈的实现为例&#xff0c;在实际开发中&#xff0c;我们可能会遇到以下两个问题&#xff1a; 1.初始化和销毁管理不当&#xff1a;C语言中的栈实现通常需要手动管理内存&#xff08;如使用malloc和free&#xff09;&#xff0c;这导致初始化和销毁栈时容易出错或…

linux打包qt程序

Linux下Qt程序打包_linuxdeployqt下载-CSDN博客 Linux/Ubuntu arm64下使用linuxdeployqt打包Qt程序_linuxdeployqt arm-CSDN博客 本篇文章的系统环境是 : 虚拟机ubuntu18.04 用下面这个qmake路径 进行编译 在 ~/.bashrc 文件末尾&#xff0c;qmake目录配置到文件末尾 将上图中…

气象与旅游之间的关系,如果借助高精度预测提高旅游的质量

气象与旅游之间存在密切的关系,天气条件直接影响旅游者的出行决策、旅游体验和安全保障。通过高精度气象预测技术,可以有效提升旅游质量,为游客和旅游行业带来显著的优势。 1. 提高游客出行决策效率 个性化天气服务:基于高精度气象预测,旅游平台可以提供个性化的天气预报服…

华为OD --- 靠谱的车

华为OD --- 靠谱的车 题目OJ用例独立实现思路源码 参考实现思路源码实现 题目 OJ用例 测试用例case 独立实现 思路 独立实现的思路比较简单,直接建一个长度为N的数组,然后找出index中不包含4的项数即可 源码 const rl require("readline").createInterface({ …

可视化平台FineReport的安装及简单使用

1. FineReport产品 FineReport介绍 FineReport报表软件是一款纯Java编写的、集数据展示(报表)和数据录入(表单)功能于一身的企业级web报表工具&#xff0c;它专业、简捷、灵活的特点和无码理念&#xff0c;仅需简单的拖拽操作便可以设计复杂的中国式报表&#xff0c;搭建数据决…

OkHttp源码分析:分发器任务调配,拦截器责任链设计,连接池socket复用

目录 一&#xff0c;分发器和拦截器 二&#xff0c;分发器处理异步请求 1.分发器处理入口 2.分发器工作流程 3.分发器中的线程池设计 三&#xff0c;分发器处理同步请求 四&#xff0c;拦截器处理请求 1.责任链设计模式 2.拦截器工作原理 3.OkHttp五大拦截器 一&#…

Nginx主要知识点总结

1下载nginx 到nginx官网nginx: download下载nginx&#xff0c;然后解压压缩包 然后双击nginx.exe就可以启动nginx 2启动nginx 然后在浏览器的网址处输入localhost&#xff0c;进入如下页面说明nginx启动成功 3了解nginx的配置文件 4熟悉nginx的基本配置和常用操作 Nginx 常…

概率论得学习和整理27:关于离散的数组 随机变量数组的均值,方差的求法3种公式,思考和细节。

目录 1 例子1&#xff1a;最典型的&#xff0c;最简单的数组的均值&#xff0c;方差的求法 2 例子1的问题&#xff1a;例子1只是1个特例&#xff0c;而不是普遍情况。 2.1 例子1各种默认假设&#xff0c;导致了求均值和方差的特殊性&#xff0c;特别简单。 2.2 我觉得 加权…

初学stm32 --- 时钟配置

目录 stm32时钟系统 时钟源 &#xff08;1&#xff09; 2 个外部时钟源&#xff1a; &#xff08;2&#xff09;2 个内部时钟源&#xff1a; 锁相环 PLL PLLXTPRE&#xff1a; HSE 分频器作为 PLL 输入 (HSE divider for PLL entry) PLLSRC&#xff1a; PLL 输入时钟源 (PL…

Latex+VsCode+Win10搭建

最近在写论文&#xff0c;overleaf的免费使用次数受限&#xff0c;因此需要使用本地的形式进行编译。 安装TEXLive 下载地址&#xff1a;https://mirror-hk.koddos.net/CTAN/systems/texlive/Images/ 下载完成直接点击iso进行安装操作。 安装LATEX Workshop插件 设置VsCode文…

深度学习之目标检测篇——残差网络与FPN结合

特征金字塔多尺度融合特征金字塔的网络原理 这里是基于resnet网络与Fpn做的结合&#xff0c;主要把resnet中的特征层利用FPN的思想一起结合&#xff0c;实现resnet_fpn。增强目标检测backone的有效性。代码实现如下&#xff1a; import torch from torch import Tensor from c…

Leetcode 面试150题 399.除法求值

系列博客目录 文章目录 系列博客目录题目思路代码 题目 链接 思路 广度优先搜索 我们可以将整个问题建模成一张图&#xff1a;给定图中的一些点&#xff08;点即变量&#xff09;&#xff0c;以及某些边的权值&#xff08;权值即两个变量的比值&#xff09;&#xff0c;试…

python实现Excel转图片

目录 使用spire.xls库 使用excel2img库 使用spire.xls库 安装&#xff1a;pip install spire.xls -i https://pypi.tuna.tsinghua.edu.cn/simple 支持选择行和列截图&#xff0c;不好的一点就是商业库&#xff0c;转出来的图片有水印。 from spire.xls import Workbookdef …