递归解决赶鸭子问题,角骨定理

2023-05-16

 

一.题目分析

用递归方法设计下列各题,并给出每道题目的递归出口(递归结束的条件)和递归表达式。同时考虑题目可否设计为非递归方法,如果可以,设计出非递归的算法。

1.一个人赶着鸭子去每个村庄卖,每经过一个村子卖去所赶鸭子的一半又一只。这样他经过了七个村子后还剩两只鸭子,问他出发时共赶多少只鸭子?经过每个村子卖出多少只鸭子?

2.角谷定理。输入一个自然数,若为偶数,则把它除以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.赶鸭子问题。递归公式:由x-(x/2+1)=剩余数 可得x=2*(剩余数)+1 其中x为刚到达这个村子的鸭子数,剩余数为经过这个村子后剩余的鸭子数

P=x/2+1 等于经过这个村子卖出的鸭子数

递归出口:x<=0

递归转化为非递归:采用循环

2.角骨定理。递归公式:n==1   1;(递归出口)

                     n%2==0   n =n/2;

                                     n%2==1   n= n * 3 + 1;

递归:使用while循环

 三.算法实现

程序源代码(请写入必要的注释)。//赶鸭子问题

//赶鸭子问题
#include<stdio.h>
#include<Windows.h>
//递归
void duck1(int r,int n)//r最后一次鸭子的个数 n经过的村子个数
{
	int a = 0;//经过n-1个村子时鸭子的个数
	a = (r + 1) * 2;
	printf("有%d只鸭子\n", a);
	printf("经过第%d个村子,这次卖出去%d只鸭子\n", n, a - r);
	n = n - 1;
	if (n > 0)
		duck1(a, n);	
}

void duck2(int r,int n)
{
	int a = 0;// 经过n - 1个村子时鸭子的个数
	int p = 0;//卖出去的鸭子数
	for (int i = 0; i < 7; i++)
	{
		a = (r + 1) * 2;
		p = a / 2 + 1;
		r = a;//更新剩余的鸭子数
		printf("有%d只鸭子\n", a);
		printf("经过第%d个村子,这次卖出去了%d只鸭子\n",7-i, p);
	}
}
int main()
{
	int num = 7;
	printf("递归:\n");
	duck1(2, num);
	printf("\n非递归:\n");
	duck2(2, num);
	//测试
	int count = 510;
	for (int i = 0; i < 7; i++) {
		count = count / 2 - 1;
	}if (count == 2) {
		printf("测试代码,测试正确,最后剩余%d", count);
	}
	else {
		printf("测试结果失败");
	}
	system("pause");
	return 0;
}

角骨定理

#include<stdio.h>
#include<Windows.h>
#pragma warning(disable:4996)
//递归
int step1(int n,int count)
{
	printf("%d ", n);
	if (n == 1) //递归出口
	{
		printf("递归:需要%d次\n", count);
		return 1;
	}
	else 
	{
		if (n % 2 == 0)//偶数
		{
			n = n / 2;
		}
		else  //奇数
		{
			n = n * 3 + 1;
		}
		count = count + 1;
		step1(n,count);//递归调用
	}
	return 0;
}
//非递归
int step2(int n,int count)
{
	printf("%d ", n);
	count = 1;
	while (n!=1) //while循环,如果不等于1则进行判断
	{
		if (n % 2 == 0)//偶数
		{
			printf("%d ", n / 2);
			n = n / 2;
		}
		else //奇数
		{
			printf("%d ", n * 3 + 1);
			n = n * 3 + 1;	
		}
		count = count + 1;
	}
	printf("非递归:需要%d次\n", count);
	return 0;
}
int main()
{
	int n = 0;
	int count = 1;
	scanf("%d", &n);
	step1(n, count);
	step2(n,count);
	system("pause");
	return 0;
}

 

四.调试、测试及运行结果

1赶鸭子问题

调试①递归 总共有510只鸭子

②非递归

测试

运行结果

2.角骨定理

①递归

②非递归

运行结果

五.经验归纳

       本次上机,对于在递归的练习中,发现在写递归函数时一要找到递归关系,二要找到递归出口,不然很容易出现死循环,在将递归问题转化为非递归问题时,使用循环将其转换,递归就是自己调用自己的过程,刚开始入手总是很难想到递归关系。程序中遇到很多逻辑问题,可以通过调试发现程序出现的问题,从而更快速地发现并解决问题。

 

 

 

 

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

递归解决赶鸭子问题,角骨定理 的相关文章

  • MySQL性能优化——索引基本原理

    本教程均为本人的学习笔记 xff0c 如果有误 xff0c 请指正 xff0c 感谢大家查看 一 索引简介 1 索引的作用 MySQL索引的建立对于MySQL的高效运行是很重要的 xff0c 创建索引后 xff0c 数据库就不会进行全表查询
  • 分析并复现Apache核弹级漏洞,利用Log4j2使目标服务器执行任意代码

    12月9日晚间 xff0c ApacheLog4j2被曝光存在严重漏洞 xff0c 可以随意执行任意远程代码 xff0c 本贴将详细分析事故原因及实战复现此漏洞 xff01 一 事件详情 1 事件经过 2021年12月9日 xff0c 国内
  • SpringCloudGateway网关限流并返回自定义异常信息

    1 实现Gateway网关限流 SpringCloudGateway自带了 RequestRateLimiterGatewayFilterFactory 限流方案 xff0c 依赖redis与内置的RedisRateLimiter过滤器进行
  • 解决Maven打包的文件不带依赖项

    学习笔记 xff0c 参考别人的教程 Maven打包时不会自带依赖项Jar xff0c 导致运行失败 xff0c Pom文件直接加入以下语句即可 xff1a lt build gt lt plugins gt lt plugin gt lt
  • Git 回退(Revert)操作后无法重新合并的问题

    问题背景 xff1a 公司使用码云企业版作为代码托管平台 xff0c 采用master dev分支分类进行代码管理 xff0c matser分支为保护分支 xff0c 只能审核后在网页端提交合并 xff08 请求评审 xff09 此时dev
  • Synchronized锁失效的几种情况

    1 多例模式 Synchronized关键字注释在非静态方法上时 xff0c 锁对象是当前对象 xff0c 如果此时非单例调用 xff0c 会导致锁失效 xff01 解决方法 xff1a 1 使用单例模式 xff0c 或锁定唯一对象 2 事
  • SpringBoot字段注入和构造函数注入的区别

    文章背景 在使用Spring开发项目时 xff0c 我们经常需要使用依赖注入来管理对象之间的依赖关系 Spring提供了多种依赖注入方式 xff0c 如构造函数注入 Setter方法注入和字段注入等 这些方式各有优缺点 xff0c 需要根据
  • python和尚念经:实例化对象、调用方法、最全属性、最全内置函数

    一 xff1a 先搞懂定义 span class token keyword class span span class token class name Ball span span class token punctuation spa
  • 谈谈自媒体的流量变现。

    我两天前发了一条广告 xff0c 关于按摩颈椎仪的广告 自媒体做广告这事 xff0c 有些读者不喜欢 xff0c 有些读者见惯不惯 xff0c 我觉得没关系 xff0c 今天不谈具体广告 xff0c 今天就这个引子 xff0c 谈谈我对自媒
  • 在Windows上安装Ubuntu子系统系统,报错WslRegisterDistribution failed with error: 0x8007019e

    在Windows应用商店安装Ubuntu系统 xff0c 报错WslRegisterDistribution failed with error 0x8007019e 1 报错内容 Installing span class token p
  • 生成器(建造者)模式

    文章目录 思考生成者模式1 生成器模式的本质2 何时选用生成器模式3 优缺点4 生成器模式的结构5 实现生成器模式构建对象的多种表示形式生成器模式链式构建对象 思考生成者模式 生成器模式就是将对象构建和对象内部构建分离 xff0c 将一个复
  • 基于AList实现网盘挂载和WebDAV本地挂载网盘

    AList AList是一个支持多种存储 xff0c 支持网页浏览和 WebDAV 的文件列表程序 xff0c 由 gin 和 Solidjs 驱动 AList官方文档 xff1a https alist nn ci AList官方GitH
  • 常用Windows快捷键大全

    0 简要 要将电脑玩的溜 xff0c 快捷键是必须要掌握的技能 xff0c 本文汇总了一些常用的快捷键 xff0c 相信加以练习 xff0c 一定能提高你的工作效率 笔者将常用快捷键分为四个系列 xff0c 如下所示 xff1a Win 系
  • Centos8安装MySql,完美解决

    本文使用yum安装mysql linux版本为 centos 8 参考 xff1a MySQL官网yum源 MySQL官网Linux yum安装Mysql CentOS 8 yum安装软件时 xff0c 提示无法从AppStream下载 c
  • aws亚马逊服务器Ubuntu18脚本一键重装系统为centos7

    这两天注册了aws xff0c 送了一年的最低配服务器嘛 但是可使用的系统就是有Ubuntu和Redhat 都试了试不太好用 今天就在网上看到了一键重装的脚本 就记录分享一下 先后执行下列两条命令就可以 xff1a apt get inst
  • 利用excel求特定条件下的最大/小值(maxif/minif)

    欢迎关注我的公众号 xff1a Smilecoc的杂货铺 在Excel中有sumif countif等函数可以实现求特定条件下数值的加总和计数 xff0c 那么如何在一个或多个条件下求出此时的最大值或者最小值呢 xff1f 其实sumif函
  • 时间序列(一):时间序列数据与时间序列预测模型

    时间序列系列文章 xff1a 时间序列 xff08 一 xff09 xff1a 时间序列数据与时间序列预测模型 时间序列 xff08 二 xff09 xff1a 时间序列平稳性检测 时间序列 xff08 三 xff09 xff1a ARIM
  • Windows下解压tar.gz压缩文件

    一 tar gz是什么文件 xff1f 以 tar gz为后缀的文件是一种压缩文件 xff0c 在Linux和macOS下常见 xff0c Linux和macOS都可以直接解压使用这种压缩文件 二 怎么解压tar gz 一些软件支持解压ta
  • Python安装模块(包/库)的方法

    这里写目录标题 通过pip安装正常在线安装pip命令补全更改下载镜像 离线包安装库的下载库的安装whl的安装 tar gz的安装源码安装 本地安装报错 xff08 依赖 xff09 Pycharm中安装手动安装终端命令行安装 Jupyter

随机推荐

  • win10 安装visual studio C++ build tools 【visualcppbuildtools_full.exe】提示安装包丢失 毁坏

    win10 安装visual studio C 43 43 build tools visualcppbuildtools full exe 提示安装包丢失 毁坏 1 问题 xff1a 安装visualcppbuildtools full
  • Excel:使用powerquery进行多表合并

    注 xff1a 本文原创为 xff1a https www cnblogs com fanyu2019 p 11175827 html 本文在原创的基础上添加修改了一点内容 目录 一 单工作簿多工作表合并二 多工作簿单工作表合并三 多工作簿
  • 利用Python调用outlook自动发送邮件

    欢迎关注我的公众号 xff0c 在这里有数据相关技术经验的优质原创文章 使用Python发送邮件有两种方式 xff0c 一种是使用smtp调用邮箱的smtp服务器 xff0c 另一种是直接调用程序直接发送邮件 而在outlook中我们一般是
  • 从 Tableau文件中获取数据方法汇总

    欢迎关注我的公众号 xff0c 在这里有数据相关技术经验的优质原创文章 在实际使用Tableau中经常会遇到需要从已有的tableau文件或仪表板中导出 提取 复制数据 xff0c 本篇文章整理了相关从Tableau文件中获取数据的方法 一
  • Excel中的数字转文本和文本转数字

    公式方法 xff1a 数字转文本 xff1a 61 TEXT A1 34 34 文本转数字 xff1a 直接乘以1即可 数字转文本 xff1a 61 A1 1 或者使用value函数 61 value 分列方法 xff1a 在数据工具 下选
  • vlookup查找匹配值超过255个字符显示#Value的解决办法

    错误原因 这一个错误的起源于在匹配字符串是否相等时出现 Value错误 xff0c 如下图黄色标注的部分 在Excel中提示的错误是 公式中所用的某个值是错误的数据类型 xff08 a value used in the formula i
  • HEXO部署博客内容到github报错

    今天在更新部署博客内容时出现了如下报错 xff1a 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 6
  • GO通过HTTP获取API的返回值(response)

    目录 net httpnet url net http span class token keyword import span span class token string 34 net http 34 span Go语言提供了HTTP
  • STM32F103学习笔记(2.3)——读GPIO 按键

    为了读取引脚的高低电平 xff0c 就需要将引脚配置成输入模式 xff0c 并读取IDR寄存器 目录 寄存器配置 端口配置低寄存器 GPIOx CRL x 61 A E 端口输入数据寄存器 GPIOx IDR x 61 A E 按键点灯 寄
  • Windows系统下,Ubuntu安装至移动硬盘(简单分析与详细安装教程)

    前期说明 博主因学业要求 xff0c 需要同时使用Windows系统与Linux系统 xff0c 故而考虑安装双系统 但个人电脑硬盘仅剩100G左右大小 xff0c 安装双系统可能导致硬盘容量不足 xff0c 恰好博主手中有个空闲的移动硬盘
  • QT开发学习4(远程调试 Qt 程序)

    2 5 1 rsync 方式 Qt 远程调试 在 Qt Creator 中默认情况下 xff0c 会使用 sftp 或 rsync 发送程序到板卡 由于正点原子 I MX6 U 出厂 Qt 文件系统 xff08 文件系统 V1 9 及之后的
  • 使用 python requests 模块发送 http 请求及接收响应

    内容概要 如何构建GET 与 POST request 请求消息对 request 的header query string message body 定制化http header参数 content type 的设置分析request r
  • 汇编.section和.text以及入口地址解释

    section data 汇编程序中以 开头的名称并不是指令的助记符 xff0c 不会被翻译成机器指令 xff0c 而是给汇编器一些特殊指示 xff0c 称为汇编指示 xff08 Assembler Directive xff09 或伪操作
  • Linux - 配置Linux用户的环境变量- Anaconda3的环境变量配置

    目录 临时生效变量环境变量的分类 xff08 永久生效 xff09 如何让某个命令永久生效环境变量配置文件的运行顺序参考链接 Linux 操作系统的环境变量 xff0c 看似很复杂 xff0c 其实不然 我们通常用到的Windows 操作系
  • 兔子繁殖问题

    首先读懂题目 xff0c 知道运算规律后在使用斐波那契数列九很好解决啦 7 26 兔子繁殖问题 10 分 已知有一对兔子 xff0c 每个月可以生一对兔子 xff0c 而小兔子一个月后又可以生一对小兔子 比如 2月份出生的小兔子4月份可以生
  • 华为Atlas200DK环境配置指南(版本20.0.0)

    官方参考文档 https support huaweicloud com usermanual A200dk 3000 atlas200dk 02 0024 html 务必保证配置时版本 20 0 0 一致 1 配置开发环境 自己电脑 若不
  • 软件工程(速成)——第三章 需求分析

    一 需求分析 1 需求分析的概念与任务 xff1a 需求分析是软件定义时期的最后一个阶段 xff0c 它的基本任务是准确地回答 系统必须做什么 这个问题 二 分析建模与规格说明 需求分析应该建立三种模型 xff1a 数据模型 功能模型 行为
  • Pytorch 深度学习实战:视频自动打码

    点击上方 小白学视觉 xff0c 选择加 34 星标 34 或 置顶 重磅干货 xff0c 第一时间送达 人脸识别 人脸识别是一门比较成熟的技术 它的身影随处可见 xff0c 刷脸支付 xff0c 信息审核 xff0c 监控搜索 xff0c
  • 基于深度学习的视觉目标跟踪方法

    点击上方 小白学视觉 xff0c 选择加 34 星标 34 或 置顶 重磅干货 xff0c 第一时间送达 以前写过一个 自动驾驶中的目标跟踪 介绍 xff0c 这次重点放在深度学习和摄像头数据方面吧 先提一下以前说的那篇综述 xff1a 3
  • 递归解决赶鸭子问题,角骨定理

    一 题目分析 用递归方法设计下列各题 xff0c 并给出每道题目的递归出口 xff08 递归结束的条件 xff09 和递归表达式 同时考虑题目可否设计为非递归方法 xff0c 如果可以 xff0c 设计出非递归的算法 1 一个人赶着鸭子去每