C++知识点总结(29):递归练习

一、满足条件的值

1. 审题

已知: S = 1 + 2 + 4 + 7 + 11 + 16 … S=1+2+4+7+11+16… S=1+2+4+7+11+16
递归求解刚好大于等于 5000 5000 5000 S S S 的值。

2. 参考答案

#include <iostream>
using namespace std;

// 定义递归函数,计算第x个数的值
int f(int x)
{
    int r;
    if (x == 1) 
        r = 1; // 第一个数为 1
    else 
        r = f(x-1) + x-1; // 第 x 个数为第 x-1 个数加上 x-1
    return r;
}

int main()
{
    int s = 0, i = 1; // 初始化累加和 s 为 0,计数器 i 为 1
    while (s <= 5000) // 循环累加直到 s 大于 5000
    {
        s += f(i++); // 将第 i 个数的值累加到 s 上,并将 i 自增
    }
    cout << s; // 输出累加和
    return 0;
}

二、递归组合数

1. 审题

n n n 个物品里面选出 m m m 个物品的方案数,记为 C ( n , m ) C(n,m) C(n,m)。对于递归过程如下理解:假设 n n n 个物品里面有一个物品最特殊,挑选时 m m m 个物品时,这个特殊物品假定不需要挑选出来,此时要从 n n n 个物品里选出 m m m 个物品,就相当于要从 n − 1 n-1 n1 个物品里面挑选出 m m m 个物品记为: C ( n − 1 , m ) C(n-1,m) C(n1,m) 。如果挑选出来物品中有这个特殊的物品,则挑选的方式就是从 n − 1 n-1 n1 个物品中挑选出 m − 1 m-1 m1 个物品记为: C ( n − 1 , m − 1 ) C(n-1,m-1) C(n1,m1)。所以 C ( n , m ) = C ( n − 1 , m ) + C ( n − 1 , m − 1 ) C(n,m)=C(n-1,m)+C(n-1,m-1) C(n,m)=C(n1,m)+C(n1,m1)。特别的当 n n n m m m 相等时或者挑选的数是 0 0 0 时,方案数规定为只有 1 1 1 种,表述为 C ( n , n ) = C ( n , 0 ) = 1 C(n,n) = C(n,0) =1 C(n,n)=C(n,0)=1。现在请你从电脑中输入两个正整数,分别表示 n n n m m m,求从 n n n 个物品中选择 m m m 个物品,总共有多少选择方法?

2. 参考答案

#include <iostream>
using namespace std;

// 递归计算组合数
int c(int n, int m)
{
	// 完全按照题目说的来
    if (n == m || m == 0) return 1;
    return c(n-1, m) + c(n-1, m-1);
}

int main()
{
    int n, m;
    cin >> n >> m;
    cout << c(n, m);
}

三、你的变换

1. 审题

你有一个数 a a a,你想把这个数变成 b b b,为此你可以做两种变换:
① 把现有的数 x x x 变为 2 x 2x 2x;
② 把现有的数 x x x 后面接一个 1 1 1(即 x x x 变为 10 x + 1 10x+1 10x+1
例如:2 -> 4 -> 8 -> 81 -> 162
你需要帮可多判断一下,把 a a a 变成 b b b 的可能性。

2. 参考答案

#include <iostream>
using namespace std;

// 递归判断是否存在变换路径
bool transform(int a, int b)
{
    if (a == b) return 1; // 当 a 和 b 相等时,变换成功,返回 true
    if (a > b) return 0; // 当 a 大于 b 时,无法变换,返回 false
    return transform(a*2, b) || transform(a*10+1, b); // 递归进行两种变换判断
}

int main()
{
    int a, b;
    cin >> a >> b;
    cout << (transform(a, b) ? "YES" : "NO"); // 输出是否存在变换路径
    return 0;
}

四、递归方块

1. 审题

请添加图片描述
给出层数,求方块总数。

2. 参考答案

#include <iostream>
using namespace std;

int n;
int sum;

int f(int x)
{
    if (x == 1) return 1;
    return f(x-1) + x;
}

int main()
{
    cin >> n;
    while (n)
    {
        sum += f(n--);
    }
    cout << sum;
    return 0;
}

五、达到回文的次数

1. 审题

回文数的定义为:如果把一个数的各个数位上的数字颠倒过来得到的新数与原数相等,则此数是回文数。 7 , 22 , 131 , 2112 , 31013 , … 7,22,131,2112,31013,… 7,22,131,2112,31013, 都是回文数。对任意给出的一个整数 n n n,经过一系列的处理,最后都能成为回文数。处理的方法是,该数加上它的颠倒数。
例如:
n = 176 n=176 n=176
第一次处理后 176 + 671 = 847 176+671=847 176+671847
第二次处理后 847 + 748 = 1595 847+748=1595 847+7481595
第三次处理后 1595 + 5951 = 7546 1595+5951=7546 1595+59517546
第四次处理后 7546 + 6457 = 14003 7546+6457=14003 7546+645714003
第五次处理后 14003 + 30041 = 44044 14003+30041=44044 14003+3004144044
此时成为回文数,共进行 5 5 5 次处理。
问题:给出 n n n 后,求出使该数按照以上规则进行一系列处理后成为回文数的最少操作次数。

2. 参考答案

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;

string n;
int cnt;

// 将字符串 n 翻转
string reverse(string n)
{
    reverse(n.begin(), n.end());
    return n;
}

// 递归函数
void palin(string n)
{
    string reversed = reverse(n);
    long long n2 = stoll(n); // string -> long long
    long long rev = stoll(reversed); // string -> long long
    long long sum = n2 + rev; // 本身 + 颠倒
    cnt++; // 次数增加
    if (to_string(sum) == reverse(to_string(sum))) return; // 已经回文
    return palin(to_string(sum)); // 没有回文,继续递归
}

int main()
{
    cin >> n;
    if (n != reverse(n))
    {
        palin(n);
    }
    else
    {
        cout << 0;
        return 0;
    }
    cout << cnt;
    return 0;
}

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

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

相关文章

LeetCode700:验证二叉搜索树

题目描述 给你一个二叉树的根节点 root &#xff0c;判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下&#xff1a; 节点的左子树 只包含 小于 当前节点的数。 节点的右子树只包含 大于 当前节点的数。 所有左子树和右子树自身必须也是二叉搜索树。 代码 使用中序…

Linux:zabbix—windows端agent部署(4)

本章的内容是通过在windows操作系统上部署zabbix的agent插件&#xff0c;从而实现通过zabbix来监控Windows 1.获取安装包 访问官方下载网站 Download Zabbix agentshttps://www.zabbix.com/cn/download_agents 2.部署agent 下载下来&#xff0c;放到要监控的Windows设备上双…

蓝桥杯— —小明的背包问题

小明的背包问题 小明的背包1 — — &#xff08;01背包&#xff09; 友情链接&#xff1a;小明的背包1 题目&#xff1a; 输入样例: 5 20 1 6 2 5 3 8 5 15 3 3 输出样例&#xff1a; 37思路&#xff1a; 对于01背包问题&#xff0c;其中一个重要的条件是每一种物品只有一个…

【题目】【信息安全管理与评估】2022年国赛高职组“信息安全管理与评估”赛项样题4

【题目】【信息安全管理与评估】2022年国赛高职组“信息安全管理与评估”赛项样题4 信息安全管理与评估 网络系统管理 网络搭建与应用 云计算 软件测试 移动应用开发 任务书&#xff0c;赛题&#xff0c;解析等资料&#xff0c;知识点培训服务 添加博主wx&#xff1a;liuliu548…

【Godot4.2】myPoint类 - 基于旋转和移动的点求取方式

概述 记得很久以前&#xff08;大约17年前&#xff09;有个用指令绘图的软件&#xff08;不是LOGO&#xff0c;而是它的一个模仿者&#xff0c;我找半天实在找不到。&#xff09;&#xff0c;基于移动和旋转来绘制折线。每次移动和旋转都是基于当前位置和方向&#xff0c;就像…

项目4-图书管理系统2+统一功能处理

1. 拦截器&#xff08;Interceptor&#xff09; 我们完成了强制登录的功能, 后端程序根据Session来判断用户是否登录, 但是实现⽅法是比较麻烦的。 所需要处理的内容&#xff1a; • 需要修改每个接⼝的处理逻辑 • 需要修改每个接⼝的返回结果 • 接⼝定义修改, 前端代码也需…

分享一个预测模型web APP的功能模块和界面的设计

一个临床预测模型web APP功能模块与界面设计 随着医疗技术的不断进步&#xff0c;web APP是临床预测模型在医学领域的应用的重要形式。这里分享一个web APP的设计&#xff0c;手里有医学预测模型的可以尝试将其构建成webAPP&#xff0c;进而在临床实践中体验预测模型带来的便利…

BugkuCTF:overflow2[WriteUP]

从题目中下载得到pwn文件 使用checksec工具对它进行检查&#xff0c;没有栈溢出保护 再根据题目提示可以知道这道题应该是利用栈溢出漏洞来做 把该文件放到linux中运行&#xff0c;可以看到有一个输入、输出的操作 把pwn丢进IDA里进行反编译分析 先看main函数&#xff0c;分…

Windows Server 2016虚拟机安装教程

一、VMware Workstation虚拟机软件的下载 官网下载入口&#xff1a;​​​​​​Download VMware Workstation Pro - VMware Customer Connect​​​​​ 下载好之后自己看着提示安装软件就好. 二、镜像文件的下载 下载网站入口&#xff1a;MSDN, 我告诉你 - 做一个安静…

关注招聘 关注招聘 关注招聘

&#x1f525;关注招聘 &#x1f525;关注招聘 &#x1f525;关注招聘 &#x1f525;开源产品&#xff1a; 1.农业物联网平台开源版 2.充电桩系统开源版 3.GPU池化软件(AI人工智能训练平台/推理平台) 开源版 产品销售&#xff1a; 1.农业物联网平台企业版 2.充电桩系统企业…

BCD BIN 转换

1&#xff0c;BCD是将10进制的每一位转换成2进制 如22 的中数子2的2进制就是0010&#xff0c;那么22的BCD 嘛就是 0010 0010 2&#xff0c;bin 的就是将2进制的每4位转成10进制 如 34的2进制就是0010 0010 高四位和低四位都是 0010 &#xff0c;0010对应的10进制就是2 那么…

FPGA压缩算法 (一)

压缩算法 简介 压缩算法是通过去除冗余信息来达到的&#xff0c;在图像压缩算法中一般是通过去除编码冗余、像素间冗余、心理视觉冗余这三者之间的一个或多个来完成的。 编码冗余&#xff1a;当所用码字大于最佳编码长度的时候出现的冗余 像素间冗余&#xff1a;因为图像数据间…

Redis:发布和订阅

文章目录 一、介绍二、发布订阅命令 一、介绍 Redis的发布和订阅功能是一种消息通信模式&#xff0c;发送者&#xff08;pub&#xff09;发送消息&#xff0c;订阅者&#xff08;sub&#xff09;接收消息。这种功能使得消息发送者和接收者不需要直接建立连接&#xff0c;而是通…

【vue】slot 匿名插槽 / 具名插槽

slot父组件向子组件传递数据 匿名插槽–直接写 具名插槽–指定名称 父组件中 子组件中&#xff1a; 代码 App.vue <template><h2>App.vue</h2><!-- 匿名插槽 --><Header><a href"1234567890.com">1234567890</a>&…

【Linux学习笔记】安卓设置内核信息的打印级别

开发环境 开发板&#xff1a;正点原子RK3568开发板安卓版本&#xff1a;11 问题描述 在串口调试过程中经常打印出这样的一些信息 极影响调试&#xff0c;暂时又没什么用&#xff0c;有些时候还不能给它直接关了。尤其是这个信息 healthd: battery l50 v3 t2.6 h2 st3 fc10…

Dubbo面试回答简单版

一、dubbo特性 超时重试机制地址缓存多版本负载均衡&#xff1a;随机、权重轮询、最少活跃调用、一致性哈希集群容错&#xff1a;失败重试、快速失败、失败安全、失败自动恢复、并行调用、广播服务降级&#xff1a;异常时返回mock 集群容错 FailOver 失败重试&#xff0c;读…

Matlab之空间坐标系绘制平面图形

在空间直角坐标系中&#xff0c;绘制指定平面方程的图形 版本说明&#xff1a; 20240413_V1.01&#xff1a;更正代码错误&#xff0c;并修改输入参数类型&#xff08;测试用例得修改&#xff09; 20240413_V1.00&#xff1a;初始版本 一、平面方程 基本形式为&#xff1a;A…

微服务边车模式深度解析:赋能云原生应用的终极指南(自己搞一个简单SideCar?)

什么是SideCar? Sidecar模式定义&#xff1a; Sidecar 模式是一种常用于微服务架构中的设计模式&#xff0c;该模式允许将应用程序的核心功能与辅助功能&#xff08;如日志记录、监控、配置管理、网络通信等&#xff09;分离开来。在这种设计模式中&#xff0c;每个微服务主容…

回归预测 | Matlab基于RIME-SVR霜冰算法优化支持向量机的数据多输入单输出回归预测

回归预测 | Matlab基于RIME-SVR霜冰算法优化支持向量机的数据多输入单输出回归预测 目录 回归预测 | Matlab基于RIME-SVR霜冰算法优化支持向量机的数据多输入单输出回归预测预测效果基本描述程序设计参考资料 预测效果 基本描述 1.Matlab基于RIME-SVR霜冰算法优化支持向量机的数…

【数据结构】习题之消失的数字和轮转数组

&#x1f451;个人主页&#xff1a;啊Q闻 &#x1f387;收录专栏&#xff1a;《数据结构》 &#x1f389;前路漫漫亦灿灿 前言 消失的数字这道题目我会和大家分享三种思路。 还有一道题目是轮转数组&#xff0c;&#xff0c;也会分享三种思路&#xff0c;大…