递归算法

2023-11-02

一、一半又一只
一个人赶着鸭子去每个村庄卖,每经过一个村子卖去所赶鸭子的一半又一只。这样他经过了七个村子后还剩两只鸭子,问他出发时共赶多少只鸭子?经过每个村子卖出多少只鸭子?
1.题目分析
设经过第n个村子时有fun(n)只鸭子,卖去fun(n)/2+1只鸭子,剩下fun(n+1)只鸭子,则有fun(n)=fun(n)/2+1+fun(n+1),即fun(n)=2*(fun(n+1)+1)。经过第8个村子时有2只鸭子,即fun(8)=2。出发时共赶fun(1)只鸭子,经过第n个村子时卖出fun(n)/2+1只鸭子。
2.算法构造
fun(n)=2*(fun(n+1)+1),1<=n<8
fun(n)=2, n=8
3.算法实现
程序源代码:

/**
*author:谷美颖
*date:2018.11.15
*version:1.1
*description:一半又一只
一个人赶着鸭子去每个村庄卖,
每经过一个村子卖去所赶鸭子的一半又一只。
这样他经过了七个村子后还剩两只鸭子,
问他出发时共赶多少只鸭子?
经过每个村子卖出多少只鸭子?
**/
#include <stdio.h>
/*
fun()函数用来计算鸭子数,参数n为经过的村子数
*/
int fun(int n)
{
       if(n==8)        //递归出口。村子数为8时递归结束,鸭子数为2
          return 2;      
      else
          return 2*(fun(n+1)+1);     //递归体
}

void main()
{
      printf("出发时共赶%d只鸭子\n",fun(1));
      for(int i=1;i<8;i++)
     {
          printf("经过第%d个村子卖出%d只鸭子\n",i,fun(i)/2+1);//输出经过每个村子卖出的鸭子数
     }
}

二、角谷定理。
输入一个自然数,若为偶数,则把它除以2,若为奇数,则把它乘以3加1。经过如此有限次运算后,总可以得到自然数值1。求经过多少次可得到自然数1。
如:输入22,
输出 22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1
STEP=16
1.题目分析
设fun(n)表示关于自然数n的一个函数,由题意已知,当n=1时,fun(1)=1。当n>1且n为偶数时,fun(n)=fun(n/2);当 n>1且n为奇数时,fun(n)=fun(3n+1)。得到自然数1的运算次数为每次运算次数之和。
2.算法构造
fun(1)=1,n=1
fun(n)=fun(n/2),n>1且n为偶数
fun(n)=fun(3
n+1),n>1且n为奇数
3.算法实现

/**
*author:谷美颖
*date:2018.11.15
*version:2.1
*description:角谷定理。
输入一个自然数,若为偶数,则把它除以2,若为奇数,则把它乘以3加1。
经过如此有限次运算后,总可以得到自然数值1。求经过多少次可得到自然数1。
**/
#include<stdio.h>
/*
fun()函数用来实现角谷定理的算法。参数n为初始自然数,i用来计算次数,初始次数为1
*/
int fun(int n,int i)
{
	if(n==1)                 //递归出口。当n为1时,退出递归
	{
		printf("\n");
		printf("STEP=%d\n",i);   //输出次数
		return 1;
	}
	else                  //递归体
	{
		if(n%2==0)           //当n为偶数时
		{
			printf("%d   ",n/2);
			i=i+1;           //次数加1 
			return fun(n/2,i);     //递归体
		}
		else                 //当n为奇数时
		{
			printf("%d   ",3*n+1);
			i=i+1;
			return fun(3*n+1,i);   //递归体
		}
	}
}

void main()
{
	int m,j=1;
	printf("请输入一个自然数:");
	scanf("%d",&m);                   //输入一个自然数
	printf("%d   ",m);
	fun(m,j);
}

三、电话号码的字符组合
电话号码对应的字符组合:在电话或者手机上,一个数字如2对应着字母ABC,7对应着PQRS。那么数字串27所对应的字符的可能组合就有3*4=12种(如AP,BR等)。现在输入一个3到11位长的电话号码,请打印出这个电话号码所对应的字符的所有可能组合和组合数。
1.题目分析
用数组存放数字字符的转换
show(0,2)-> output[0]=A-> show(1,2)-> 1!=2-> output[1]=D-> ;k=1 show(2,2)-> 2=len-> 输出AD-> i+1-> output[1]=E-> show(2,2)-> 2=len-> 输出AE i=2-> output[1]=F-> show(2,2)-> 2=len-> 输出AF ;再回到k=0-> i=1 output[0]=ch[0][1]=B 输出BD,BE,BF i=2 输出CD,CE,CF
2.算法构造
在此论证算法设计中的一些必要的设计依据。
for(int i=0;i<total[input[k]];i++){ // 递归出口
output[k]=ch[input[k]][i];
fun(k+1,len); //递归体
}
3.算法实现
程序源代码(请写入必要的注释)。

/**
*author:谷美颖
*date:2018.11.17
*version:3.1
*description:电话号码对应的字符组合
在电话或者手机上,一个数字如2对应着字母ABC,7对应着PQRS。
那么数字串27所对应的字符的可能组合就有3*4=12种(如AP,BR等)。
现在输入一个3到11位长的电话号码,请打印出这个电话号码所对应的字符的所有可能组合和组合数。
**/
#include<stdio.h>
#include<string.h>
const char ch[10][10]={
	"",//0
	"",//1
	"ABC",//2 
	"DEF",//3
	"GHI",//4
	"JKL",//5
	"MNO",//6
	"PQRS",//7
	"TUV",//8
	"WXYZ"//9 
	};
const int total[10]={0,0,3,3,3,3,3,4,3,4}; //各个数字代表的字符总数构成的数组 
char input[20];	//保存输入电话字符数组 
int number[20];   //保存输入电话的数字
char output[20];	//输出可能字符组合
/*
fun()函数用来匹配对应字符,参数k标记指针,len为字符串长度
*/ 
void fun(int k,int len){  	
	if(k==len){ 
		output[len]='\0';  //设为结束标志,输出 
	    printf("%s\n",output);
		return ;
	}
	for(int i=0;i<total[input[k]];i++){  // 递归出口
		output[k]=ch[input[k]][i];
		fun(k+1,len);   //递归体
	}	
}
int main(){
	printf("请输入电话号码:\n");
	scanf("%s",input); //输入电话字符数组 
	int len=strlen(input);
	int sum=1;
	for(int i=0;i<len;i++){
		 input[i]-='0'; //char类型转换成int数组 
		sum*=total[input[i]];
	}
	fun(0,len);
	printf("总的组合数:%d\n",sum);
	return 0;
}

四、分桔子
日本著名数学游戏专家中村义作教授提出这样一个问题:父亲将2520个桔子分给六个儿子。分完 后父亲说:“老大将分给你的桔子的1/8给老二;老二拿到后连同原先的桔子分1/7给老三;老三拿到后连同原先的桔子分1/6给老四;老四拿到后连同原先的桔子分1/5给老五;老五拿到后连同原先的桔子分1/4给老六;老六拿到后连同原先的桔子分1/3给老大”。结果大家手中的桔子正好一样多。问六兄弟原来手中各有多少桔子?

1.题目分析
sum=2520 aver=2520/6=420;老六得到橘子后,给老大1/3后为420,所以给了老大210,老大给出原来的1/8加得到的210对于420,所以原来有240个橘子;下一个人原来的橘子数:
(nextfirstnum+givernum)(7-n)/(8-n)=420 firstnum=420(8-n)/(7-n)-givertnum
2.算法构造
在此论证算法设计中的一些必要的设计依据。
0 n>6
givernum=firstnum/(9-n) n=1
givernum=(firstnum+foregivernum)/(9-n) n>1
3.算法实现
程序源代码(请写入必要的注释)。

/**
*author:谷美颖
*date:2018.11.17
*version:4.1
*description:分桔子
日本著名数学游戏专家中村义作教授提出这样一个问题:
父亲将2520个桔子分给六个儿子。
分完 后父亲说:
“老大将分给你的桔子的1/8给老二;
老二拿到后连同原先的桔子分1/7给老三;
老三拿到后连同原先的桔子分1/6给老四;
老四拿到后连同原先的桔子分1/5给老五;
老五拿到后连同原先的桔子分1/4给老六;
老六拿到后连同原先的桔子分1/3给老大”。
结果大家手中的桔子正好一样多。
问六兄弟原来手中各有多少桔子?
**/
#include<stdio.h>
//fun()函数用来实现分桔子,参数first代表原有的桔子, forenum代表前n-1一个人给的桔子数,n代表老几
int fun(int firstnum,int foregivernum,int n){  
	int  givernum=0;
	if(n>5){   //递归出口
		return 0;
	}
	else{	
		//计算分给下一个数目
		if(n==1){ //第一个人是先直接给 
			printf("老%d原来的桔子数:%d\n",n,firstnum);
			printf("老%d得到的桔子数:%d\n",n,foregivernum);
			givernum=firstnum/(9-n); 
			printf("老%d给出的桔子数:%d\n",n,givernum);
			foregivernum=givernum;
		}
		else{ //先得到后再给
			printf("老%d得到的桔子数:%d\n",n,foregivernum);
			int givernum=(firstnum+foregivernum)/(9-n);//当前给出的桔子数
			printf("老%d给出的桔子数:%d\n",n,givernum);
			foregivernum=givernum;	
		}
		//下一个人原来的桔子数
		int firstnum=420*(8-n)/(7-n)-foregivernum;
		printf("老%d原来的桔子数:%d\n",n+1,firstnum);
		n=n+1;
		fun(firstnum,foregivernum,n);	 //递归体 
	}
	return 0;
} 
int main(){
	fun(240,210,1);
	return 0;
}

五、总结:
1.先观察是否能得到问题小规模化时的解决方法。
2.分析问题规模慢慢变大时其解决方法的过程是否相同。
3.分析问题之间的递归关系。(难点在此处,递归关系的发现是关键之处)
4.将1作为边界,列出关系式。编程解决之。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

递归算法 的相关文章

  • TCP/IP协议及常见状态码(SYN,FIN,ACK,PSH,RST)

    TCP IP协议及常见状态码 SYN FIN ACK PSH RST 1 TCP IP协议 2 TCP协议原理 3 TCP报文格式 4 三次握手的状态码 对于软件测试工程师 前后端工程师 网络工程师 运维工程师等都需要对计算机网络基础知识有
  • SpringCloud构建微服务之基础环境搭建

    前言 本次我们将使用SpringCloud构建一个用户微服务案例 Consumer消费者 Client 通过REST调用Provider提供者 Server 提供的服务 构建环境 SpringCloud Dalston SR1 Spring
  • ChatGPT实现代码解释

    代码解释 新手程序员在入门之初 最好的学习路径就是直接阅读其他人的代码 从中学会别人是怎么写的 为什么这么写 过去 这个学习过程可能需要广泛阅读官方文档 在 GitHub issue 上提问 上 Stack Overflow 网站查询 见缝
  • WebView加载网页不显示图片解决办法

    对于大家来讲WebView肯定很熟悉 因为我们在日常开发中经常用到它 所以对于它的一些基本用法我就不在这啰嗦了 直接进入正题 我遇到的问题就是在使用WebView加载网页的时候图片不显示 我手机系统是5 1 1 当时出现这个问题我就想当然的
  • Google Protobuf自动反射功能

    Google Protobuf自动反射功能 看了下Google Protobuf的源码 对于反射机制 无论c 实现还是java实现都是采用map查找 这个应很高效率 实际我们在项目中无形中也用 到了这种思路 仅仅没系统化 通过一个类的原型对
  • webpack5 学习(九)—— 环境变量

    webpack 命令行环境配置的 env 参数 允许传入任意数量的环境变量 在 webpack config js 中可以访问到这些环境变量 例如 env production 或 env goal local npx webpack en
  • 算法设计艺术——编程珠玑第八章

    算法设计艺术 编程珠玑第八章 下面是书本中讲解的四个算法 问题 求一维数组中连续子向量的最大和 例如 a 6 3 4 2 9 10 8 则最大连续子向量的和 为 10 8 18 1 解法一 简单算法 html view plain copy
  • Shell函数的7种用法介绍

    1 在shell文件内部定义函数并引用 复制代码代码如下 shell function cat factorial sh bin bash function factorial factorial 1 for i 1 i lt 1 i do
  • mysql mariadb中查询查询用户和权限总结 及备份

    一 在mysql数据中 自带以下张表 存储用户的表在myql数据库的user表中 Database information schema mysql performance schema SELECT User Host Password
  • 数据湖是什么?

    数据湖或hub的概念最初是由大数据厂商提出的 不同的厂商有不同的定义 维基百科定义 数据湖是一类存储数据自然 原始格式的系统或存储 通常是对象块或者文件 数据湖通常是企业中全量数据的单一存储 全量数据包括原始系统所产生的原始数据拷贝以及为了
  • InnoSetup制作Qt项目安装包

    1 安装Inno Setup InnoSetup官方网站 Inno Setup 说明 InnoSetup是免费软件 建议官网下载安装 下载位置示例如下 2 打包Qt项目 使用Qt windeployqt exe自动抽取项目Qt依赖库 备注
  • Sonar代码扫描常见规则总结

    Sonar代码扫描常见规则 最近公司项目交付 交付前集成 功能 性能 安全种种测试工作就来了 由于测试离职 被抓壮丁 兼职起测试修改工作 小公司 平时敲 ctrl c 代码 ctrl v 时 同事也不在意一些代码规范 以及一些常见的规约要求
  • 为啥海康摄像头网页无法预览

    最近在做IPC相关的业务 用谷歌 火狐都无法预览摄像头画面 即使装了插件也不行 后面发现了 要用IE打开 才能预览 转载于 https www cnblogs com 132818Creator p 10980880 html
  • python 面向对象编程(2)

    文章目录 前言 封装 多态 类属性和实例属性 定义以及访问类属性 修改类属性 实例属性 类方法 静态方法 前言 前面我们介绍了 python 类和对象以及继承 私有权限 那么今天我们将来介绍 python面向对象 剩下的两大特性封装 多态
  • 蓝桥杯Python->面向对象:类 and 方法 练习->成绩分析练习

    作者 芝士小熊饼干 系列专栏 数据结构 蓝桥杯 算法 坚持天数 3天 烤地瓜案例练习实现对面向对象的理解 抽象一个地瓜类 class SweetPotato object 实现初始化方法 初始地瓜的状态和总烧烤时间 def init sel
  • scala运行异常Could not locate executable null\bin\winutils.exe in the Hadoop binaries

    java io IOException Could not locate executable null bin winutils exe in the Hadoop binaries 出现这个问题的原因是我们在windows上模拟开发环境
  • 使用vuex实时更新右上角通知信息的红点数量

    需求如图 因为这两个不存在组件关系 所以我们使用Vuex来解决这个实时刷新 1 首先在vuex的state定义数据如下 state noticeCount 0 2 更改 Vuex 的 store 中的状态的唯一方法是提交 mutation
  • ensp usg6000v ping不通_华为USG6000V防火墙和VMWARE的联动

    快到周末了 来一篇技术类公众号文章 最近看一本很有意思的书 叫 华为防火墙技术漫谈 俗话说得好 理论结合实践才是王道 下面来简要描述一下本周做过的一个比较有意思的实验 在这个实验中使用到了ENSP模拟器 USG6000V防火墙 VMWARE
  • 【数模研赛】“华为杯”第十九届中国研究生数学建模竞赛C题分享——(四)问题二模型建立

    写在前面 第十九届数模研赛在22年10月6 10日开展 我和我的两名队友肝了5天 整出来一篇论文 因为不确定自己做的好不好 所以一直没写博客 前两天结果出来了 我们队拿了国二 在C题里排名88 1134 感觉结果还不错 以后应该也不会再有机
  • UE4 实现控制场景中所有物体透明度功能

    本文会讲解如何利用材质参数集简单的实现修改场景中所有物体透明度的功能 讲解地图为第三人称地图 1 创建材质变量集 这里面新建的变量可以在蓝图中控制 这样就能很方便的修改透明度 因为透明度是只有一个值的参数所以创建scalar参数 默认值为1

随机推荐

  • c语言的product,张永强:C语言中product是什么意思

    吴俊光的回答 product在C语言中不是关键字 C库中也没有这样的函数名 所以pruduct有两种可能 1是编程者自己定义的变量 2是编程者自定义的函数的名字 这里product是自定义函数的名字 功能就是返回a乘b的结果 实现一个乘法功
  • 【转载】Linux下用ls和du命令查看文件以及文件夹大小

    1 ls的用法 ls ll 列出当前目录下所有文件的大小以及所有文件大小的统计总和 显示成字节大小 ls lh 列出当前目录下所有文件的大小以及所有文件大小的统计总和 以KB MB等为单位进行显示 ls l grep wc l 或 find
  • 基于BCM53262交换芯片平台的Linux操作系统移植(四)之代码调试与驱动书写

    2018 05 09 10 49 zhoulinhua 2018 05 10 一 系统分区 name address size bootstrap 0x0 64k u boot 0x10000 640k env 0xb0000 192k d
  • 【C语言】练习题 - 菲姐游泳 - 附视频讲解

    游泳奥运冠军菲姐刻苦训练 从早上a时b分开始下水训练 直到当天的c时d分结束 请编程计算 菲姐当天一共训练多少小时多少分钟 本文引用自作者编写的下述图书 本文允许以个人学习 教学等目的引用 讲授或转载 但需要注明原作者 海洋饼干叔 叔 本文
  • 独立按键消抖与松手检测

    记录下最近独立按键消抖和松手检测 我对独立按键的处理思路是 1 获得键值 2 消抖处理 3 松手检测 4 键值解析 1 获得键值 这里把独立按键做个编号 例如有两个按键记为KEY0 KEY1 用一个变量来记录当前按键标记值 比如Cur Ke
  • npm install 编译时报“Cannot read properties of null (reading ‘pickAlgorithm‘)“

    先看报错 先说下网上大多数的解决方案 方案一 重新安装node解决 方案二 删了node models重新下 或者直接下载CNPM 淘宝镜像 进行安装 CNPM安装办法 npm install g cnpm registry https r
  • 解决STM32驱动0.96OLED不亮的问题

    问题描述 使用STM32无法驱动OLED 解决方案 1 检查硬件连接是否有误 OLED STM32 VCC 5V或3 3V SDA SDA SCL SCL GND GND 备注 最好接STM32最小系统版的3 3V 当连接STM32最小系统
  • Javaio流

    io流 关于Java的io流一般按照数据操作类型可以分为字节流与字符流 首先来说一下字节流 字节流 字节流的方法都是以stream结尾的 字节流的用途 转换图片为二进制 转换音频 视屏为二进制 字符串等也可以转为二进制 字节流常用于图片 音
  • 签到题【牛客算法周周练6E】【暴力枚举+线段树】

    题目链接 题目保证数据随机 数据随机真的是太强了 直接可以跑最坏时候是的复杂度 直接暴力建线段树 然后更新的时候更新到底 查询的时候也是查询到底 因为数据随机 所以其实被处理的次数是很少的 因为要刚好是set里有的 或者是set里没有的 这
  • Unity3D-----三维数学(向量)

    Unity3d gt 三维数学之向量 一 向量 1 什么是向量 2 向量的形式 3 向量的大小 4 向量的方向 二 向量运算 1 向量相减 2 向量相加 3 向量与标量的乘除法 4 点乘 5 叉乘 三 三角函数 1 角的度量单位 2 三角函
  • Labelme 目标检测和语义分割的数据标注

    1 安装labelme 打开conda prompt 输入以下代码创建虚拟环境 打开虚拟环境 安装lelme conda create n labelme python 3 6 创建虚拟环境 conda activate labelme 打
  • 解决idea出现报错:Error running,Command line is too long. Shorten command line

    报错的原因 因为项目需要打印的环境变量太长 超过了限制 需要缩短命令行来解决问题 解决办法 方法一 Edit Configurations 将默认的Shorten command line的值user local default 改为 JA
  • 格式工厂多个图片合并成一个PDF的报错

    使用图片合并PDF功能时 当图片数量超过50会报错 找到imgconv py文件 将50改为500 保存 现在可以支持100张图合并成一个PDF文件了 但是超过150张程序会直接闪退 正在解决中 补充说明 1 如何设置PDF压缩比 打开 g
  • 有奖调研

    简介 感谢您一直以来对阿里云通信短信服务的支持 为了提升用户体验 为您在数字化转型的通信之路提供助力 云通信短信服务将发起一次满意度调研 有关短信服务 无论使用情况 抑或功能需求 还是文档 产品介绍页 计算与账单 控制台 API SDK 售
  • TypeError Cannot read properties of undefined (reading ‘matched‘)vue项目创建之后写路由报错

    vue项目创建之后写路由报错 原代码 修改之后代码 在 import 路由文件后 命名为Router 就会出现报错 原因 router 才是Vue实例化的配置字段名称 不识别其他的
  • Linux下访问数据库

    Linux下访问数据库 声明 本文只简单描述Linux系统下访问mysql数据库的步骤 关于连接上数据库之后的简单的对于数据库的增删改查等操作只是稍微提及 关于增删改查的语句书写 本文不再讲述 一般来说 访问数据库有如下几个步骤 1 初始化
  • C#控制台程序中使用log4.net来输出日志

    Apache log4net 库是一个帮助程序员将日志语句输出到各种输出目标的工具 log4net 是优秀的 Apache log4j 框架到 Microsoft NE T 运行时的端口 我喜欢他可以自定义输出 区分等级等特点 导入库 我们
  • Android自定义控件(三)---实战篇(详解onMeasure)

    接着Android自定义控件 二 实战篇的讲解 这篇我们来详细讲一下测量 onMeasure 和绘制 onDraw 这两个方法 首先 我们来看测量 onMeasure 方法 在这个方法里 我们主要是设置控件的宽高 widthMeasureS
  • jqgrid 翻页记录选中行

    简单的jqgrid列表 list jqGrid url contextPath getList postData data datatype json colNames 用户名 密码 colModel name name index nam
  • 递归算法

    一 一半又一只 一个人赶着鸭子去每个村庄卖 每经过一个村子卖去所赶鸭子的一半又一只 这样他经过了七个村子后还剩两只鸭子 问他出发时共赶多少只鸭子 经过每个村子卖出多少只鸭子 1 题目分析 设经过第n个村子时有fun n 只鸭子 卖去fun