C++知识点总结(30):递归进阶练习

递归进阶练习

  • 一、 2 2 2 的幂数
    • 1. 审题
    • 2. 参考答案
      • 2.1 递归
      • 2.2 循环
  • 二、汉诺塔移动次数
    • 1. 审题
    • 2. 思路
    • 3. 参考答案
  • 三、数字乘积分解
    • 1. 审题
    • 2. 参考答案
  • 四、数字重复分解
    • 1. 审题
    • 2. 参考答案
  • 五、烤鸡调料
    • 1. 审题
    • 2. 参考答案

一、 2 2 2 的幂数

1. 审题

如果这个整数是由若干个 2 2 2 相乘得到的,那我们称它为 2 2 2 的幂数。给你一个整数 n n n,请你判断该整数是否是 2 2 2 的幂数。如果是,输出 Y Y Y ;否则,输出 N N N。用 递归循环 两种方法解决这个问题。

2. 参考答案

2.1 递归

#include <iostream>
#include <cstdio>
using namespace std;double n;bool isNum2(double n)
{if (n <= 0.0) return false;if (n == 1.0) return true;return isNum2(n / 2.0);
}int main()
{freopen("num2.in", "r", stdin);freopen("num2.out", "w", stdout);cin >> n;cout << (isNum2(n) ? "Y" : "N");fclose(stdin);fclose(stdout);return 0;
}

2.2 循环

#include <iostream>
#include <cstdio>
using namespace std;double n;int main()
{freopen("num2.in", "r", stdin);freopen("num2.out", "w", stdout);cin >> n;if (n == 1.0){cout << "Y";return 0;}if (n <= 0.0){cout << "N";return 0;}while (n){n /= 2.0;if (n == 1){cout << "Y";return 0;}}cout << "N";fclose(stdin);fclose(stdout);return 0;
}

二、汉诺塔移动次数

1. 审题

三根柱子 A A A B B B C C C 的汉诺塔,最左侧 A A A 共有 n n n 个从小到大依次垒好的圆盘,请问按照汉诺塔的规则,将这些圆盘从最左侧 A A A 柱移动到最右侧 C C C 柱,一共需要移动多少次圆盘?

2. 思路

我们可以代入 教程 二、 中所写的程序,反推出最小移动次数为 2 n − 1 2^n-1 2n1。我们可以直接输出。

而这个推出的公式原理是什么呢?最后还是回到我们发现的规律:

  • 【打开冰箱】
    将上方的 n − 1 n-1 n1 个盘子从 A A A 柱(起始柱)移动到 B B B 柱(临时柱)。借助 C C C 柱作为辅助柱。
  • 【放进大象】
    将最大的第 n n n 个盘子从 A A A 柱(起始柱)移动到 C C C 柱。
  • 【关上冰箱】
    B B B 柱(临时柱)上的 n − 1 n-1 n1 个盘子移动到 C C C 柱(终点柱)。借助 A A A 柱作为辅助柱。

那么我们可以推导出下面两个公式:
f ( n ) = f ( n − 1 ) + 1 + f ( n − 1 ) = 2 × f ( n − 1 ) + 1 f(n) = f(n-1) + 1 + f(n-1)=2\times f(n-1)+1 f(n)=f(n1)+1+f(n1)=2×f(n1)+1
f ( n ) = 2 n − 1 f(n)=2^n-1 f(n)=2n1

3. 参考答案

递归法

#include <iostream>
using namespace std;int n;int f(int x)
{if (x == 1) return 1;return 2 * f(x-1) + 1;
}int main()
{cin >> n;cout << f(n);return 0;
}

公式法

#include <iostream>
#include <cmath>
using namespace std;int n;int main()
{cin >> n;cout << pow(2, n) - 1;return 0;
}

三、数字乘积分解

1. 审题

一个正整数,可以分解成多个大于 1 1 1 的整数的乘积的形式,要求这些数字从左向右是不增的(即后一个数小于等于前一个数)。请你求出对于一个整数 n n n,请你按字典序从大到小输出所有的方案。

2. 参考答案

#include <iostream>
using namespace std;int n;
int a[55];void dfs(int x, int pos)
{if (x == 1){cout << a[1];for (int i = 2; i <= pos-1; i++){cout << "*" << a[i];}cout << endl;return;}for (int i = min(x, a[pos-1]); i >= 2; i--){if (x % i == 0){a[pos] = i;dfs(x/i, pos+1);}}
}int main()
{cin >> n;a[0] = n;dfs(n, 1);return 0;
}

四、数字重复分解

1. 审题

一个正整数,对它取数位之后相加,例如 49 49 49 取数位相加 4 + 9 = 13 4+9=13 4+9=13,如果结果不是一位数,继续取数位相加, 13 13 13 取数位相加 1 + 3 = 4 1+3=4 1+3=4,直到结果是一位数为止。给你一个整数 n n n,求它不断取数位相加后的结果,要求使用递归的方法解答。

2. 参考答案

#include <iostream>
using namespace std;int n;int add(int x)
{if (x <= 9) return x;int num = x;int sum = 0;while (num){sum += num % 10;num /= 10;}return add(sum);
}int main()
{cin >> n;cout << add(n);return 0;
}

五、烤鸡调料

1. 审题

小明特别喜欢吃烤鸡,而且吃法很特别,为什么特别呢?因为他有 10 10 10 种配料(芥末、孜然等),每种配料可以放 1 1 1 3 3 3 克。烤鸡的美味程度为所有配料的重量之和。现在, 小明想要知道,如果它想让烤鸡的美味程度为 n n n,那么这 10 10 10 种配料共有多少种放法。

2. 参考答案

#include <iostream>
using namespace std;int n;
int cnt;
int temp[35];void dfs(int step, int sum)
{if (step > 10){if (sum == n){cnt++;}return;}for (int i = 1; i <= 3; i++){temp[step] = i;dfs(step + 1, sum + i);}
}int main()
{cin >> n;dfs(1, 0);cout << cnt;return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

保姆级教程!QRCNN-BiLSTM一键实现多变量回归区间预测!区间预测全家桶再更新!

​ 声明&#xff1a;文章是从本人公众号中复制而来&#xff0c;因此&#xff0c;想最新最快了解各类智能优化算法及其改进的朋友&#xff0c;可关注我的公众号&#xff1a;强盛机器学习&#xff0c;不定期会有很多免费代码分享~ 今天对我们之前推出的区间预测全家桶进行…

进程间通信IPC(二)

一、存储映射I/O(Memory-mapped I/O) 使一个磁盘文件与存储空间中的一个缓冲区相映射。于是从缓冲区中取数据&#xff0c;就相当于读文件中的相应字节。与此类似&#xff0c;将数据存入缓冲区&#xff0c;则相应的字节就自动写入文件。这样&#xff0c;就可在不使用read和write…

由于找不到msvcp110d.dll,无法继续执行代码

在计算机软件开发和运行环境中&#xff0c;动态链接库&#xff08;DLL&#xff09;文件扮演着至关重要的角色。它们封装了特定功能的代码&#xff0c;使得多个应用程序能够共享这些功能而无需重复编译或加载相同的代码&#xff0c;从而显著提升了系统资源利用率和软件开发效率。…

024——驱动、server、client、GUI全功能联调

目录 一、本次修改 二、GUI和Client之间联调 2.1 工程结构修改 2.2 将TCP程序修改为可被其它程序调用 2.3 优化显示界面 2.4 解决GUI通过tcp send的问题 2.5 处理服务器数据 时间不是很多了&#xff0c;我想压缩一下快点把属于毕设的这部分搞完&#xff0c;俺要出去旅游…

【HTML】H5新增元素记录

H5 新增元素特性 1. 语义化标签 语义化标签的好处&#xff1a; 对于浏览器来说&#xff0c;标签不够语义化对于搜索引擎来说&#xff0c;不利于SEO的优化 语义化标签&#xff1a; header:头部元素nav&#xff1a;导航section:定义文档某个区域的元素article:内容元素aside…

解锁多智能体路径规划新境界:结合启发式搜索提升ML本地策略

引言&#xff1a;多智能体路径寻找&#xff08;MAPF&#xff09;问题的重要性与挑战 在现代自动化和机器人技术迅速发展的背景下&#xff0c;多智能体路径寻找&#xff08;Multi-agent path finding&#xff0c;简称MAPF&#xff09;问题的研究变得日益重要。MAPF问题涉及为一…

【NTN 卫星通信】NTN的SSB波束探讨

1 概述 SSB是同步广播信道&#xff0c;用于小区搜索&#xff0c;主系统消息的发送。NR协议中定义了多种SSB波束格式&#xff0c;简述如下。   小区搜索是终端获取与小区的时间和频率同步并检测小区的物理层小区ID的过程。   为了进行小区搜索&#xff0c;UE接收以下同步信号…

如何将本地项目上传到gitlab

具体步骤如下&#xff1a; 1. 登录 gitLab账号&#xff0c;成功创建一个项目文件&#xff0c;生成对应的http/https地址 2.打开本地项目&#xff0c;初始化git $ git init 3.将本地git和服务器上的连接&#xff08;确保项目没有其他远程连接的服务器端口&#xff09; $ gi…

MySQL Workbench下载安装、 MySQL Workbench使用

官方下载链接;MySQL :: Download MySQL Workbench 下载好懒人安装&#xff0c;也可自己选择目录 下面是使用&#xff1a; 连接数据库&#xff1a; 填写数据库连接信息&#xff1a; 基本操作部分&#xff1a; 数据导入导出&#xff1a; 导出/备份 导入&#xff1a; 生产er图…

C#基础总结

这里写目录标题 目录1. 什么情况下需要override Equals?2. 什么时候需要override GetHashCode&#xff1f;3. int和int?有什么关系&#xff1f;两个类型转换是否涉及装箱过程&#xff1f;4. String类和StringBuiler类有什么区别&#xff1f;5. 抽象类和接口有什么区别&#x…

【热门话题】探索与心得:深入体验Microsoft Edge浏览器

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 探索与心得&#xff1a;深入体验Microsoft Edge浏览器一、Edge浏览器概述1.1 发…

基于微信小程序的房屋租赁管理系统

介绍 基于微信小程序房屋租赁管理系统&#xff0c;对房东-房屋-房间-租客进行网格化管理&#xff0c;帮助政府部门统计分析所辖区域的出租房屋情况。 微信小程序可以视为一种新形态的应用。相比于已有的嵌入在浏览器中的HTML5网页应用&#xff0c;他具有更高的系统权限&#x…

大型网站系统架构演化实例_5.使用反向代理和CDN加速网站响应

1.使用反向代理和CDN加速网站响应 随着网站业务不断发展&#xff0c;用户规模越来越大&#xff0c;由于区域的差别使得网络环境异常复杂&#xff0c;不同地区的用户访问网站时&#xff0c;速度差别也极大。有研究表明&#xff0c;网站访问延迟和用户流失率正相关&#xff0c;网…

【嵌入式】交叉编译指南:将开源软件带到嵌入式世界

&#x1f9d1; 作者简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟,欢迎关注。提供嵌入式方向的学习指导…

Rust入门-Hello World

1、安装 在 Linux 或 macOS 上安装 rustup 打开终端并输入下面命令&#xff1a; $ curl --proto https --tlsv1.2 https://sh.rustup.rs -sSf | sh如果安装成功&#xff0c;将出现下面这行&#xff1a; Rust is installed now. Great!2、更新 $ rustup self uninstall3、卸…

mybatis一对一,多对一,一对多--使用自动映射避免繁琐的resultMap

头疼的一对一&#xff0c;多对一&#xff0c;一对多写法 我们知道&#xff0c;相比较hibernate,mybatis的一对一&#xff0c;一对多都比较繁琐&#xff0c;hibernate可以直接在实体类里面配置好映射关系&#xff0c;获取值的时候就能把一对一和一对多的对象带出来了&#xff0…

红黑树(Red-Black Tree)

红黑树&#xff08;Red-Black Tree&#xff09;是一种自平衡的二叉查找树&#xff0c;它具有以下特性&#xff1a; 1. 每个节点要么是红色&#xff0c;要么是黑色。 2. 根节点是黑色的。 3. 每个叶子节点&#xff08;NIL节点&#xff09;是黑色的。 4. 如果一个节点是红色的&am…

手把手教你实现贪吃蛇

前言 在实现贪吃蛇前&#xff0c;我们需要熟练地掌握C语言知识&#xff0c;对初阶数据结构中的链表有一定的掌握&#xff0c;并且我们还会使用到Win 32 API 的知识&#xff0c;下面我会对需要使用到的API接口函数进行解释。最终的代码我放在后面&#xff0c;有需要的可以自取。…

探索C语言数据结构:利用顺序表完成通讯录的实现

在好久之前我就已经学习过顺序表&#xff0c;但是在前几天再次温习顺序表的时候&#xff0c;我惊奇的发现顺序编表可以完成我们日常使用的通讯录的功能&#xff0c;那么今天就来好好通过博客总结一下通讯录如何完成吧。 常常会回顾努力的自己&#xff0c;所以要给自己的努力留…

OpenHarmony其他工具类—lua

简介 Lua是一种功能强大、高效、轻量级、可嵌入的脚本语言。 支持过程编程、面向对象编程、函数编程、数据驱动编程和数据描述。 下载安装 直接在OpenHarmony-SIG仓中搜索lua并下载。 使用说明 以OpenHarmony 3.1 Beta的rk3568版本为例 将下载的lua库代码存在以下路径&#…