递归视角下

news2024/12/26 0:15:03
def listSum(numbers):
    if not numbers:
        return 0
    else:
        (f, rest) = numbers
    return f + listSum(rest)

myList = (1, (2, (3, (4,None))))
total = listSum(myList)
print(total)

while循环何时退出? 恐怕是while循环技巧所在,即选择恰当的变量作为退出循环的条件判断。

下面的栗子选择了哪个变量作为退出条件?

原题来自宁波第23届中小学信息比赛小学组决赛最后一道题。尝试用python代替原题要求的pascal count.pas/exe)

alt

问题描述: 小Q的编程技术在一次搭积木比赛中也成了秘密武器。原来,比赛的规则是这样的:给你N个小木块(全部为一样大小的正方体)。快速搭成如下图规则的形状(下图为5层的规模),要求层数为最大限度。

由于小Q编了个程序,只要输入小木块的个数N,就可以马上求出最多可以搭几层,还剩几个,所以小Q每次都是一次成功,从不需要翻工,速度也就领先了,你会编小Q这样的程序吗?

【输入数据】

输入文件count.in:文件中只有一个整数N,表示小木块的个数,已知1≤N≤2^31。

【输出数据】

输出文件count.out:文件中有两行整数,第一行是最多可以堆的层数,第二行是剩余的小木块

Python语言的搭积木的诀窍 解法仅供参考

图片

递归的妙处:

第一条:每次递归都能将问题规模缩减下来。

第二条:对应递归终止条件,递归必须有个出口,不然会陷入无限递归当中。

第三条:将递归问题细分为更小的递归问题,然后再进行递归调用。

首先,只需要找到相邻两层之间数量关系,较大层数和小木块数量之间的关系表达为为consumer()函数

请看图:第1层是1,第2层是3,第3层用掉的木块是x,那么前3层用掉的木块总数是前2层用掉的总数,再加上第3层的木块数量。

留意:前3层和第3层所指不同,显然前3层包含第3层。持续倒推,就可以建立起第n层和第1层之间的数量关系。

alt

第n-1层需要多少个小木块作为输入参数,

x = consumer(n-1)

推出第n层需要多少小木块,

consumer(n)=consumer(n-1) + 0.5*(n**2+n)

为啥是第2层开始,总能表达为

consumer(n-1) + 0.5*(n**2+n)

为何1-> n 层的cube总的数量 = 第 n-1 层数量 + 0.5*(n**2+n)

符合以上数学关系的理由是第 n 层木块数量与 n 存在关系,不妨从求解三角形的面积公式得到灵感:

1+2+3+....n = 0.5*(n**2+n)

alt

第n层的平面图计算高斯数

please enter the cube numeber:20
4, 0

please enter the cube numeber:100
7, 16.0

please enter the cube numeber:1000
17, 31.0

但python递归的问题爆栈在随手将 n 大到离谱时如约而至!呵呵

please enter the cube numeber:10000000000000

...
RecursionError: maximum recursion depth exceeded in comparison

那么,这时候有两个办法:

1、设法取消递归栈的上限:996 次; 2、或者改用循环的递推实现;

如何理解递归和循环?

SOLID原则:

分离出子函数layerSum(n)计算第 n 层有多少cube;

主函数 consumeWhile(total)判断累积cube超过total为退出循环的条件判断;

*可以与递归写法的结果比较是否一致

# SOLID分离原则 
def layersSum(n):
    # 第 n 层有多少cube
    return 0.5 *(n**2 + n)

上述可以灵活修改每一层的几何形状,如改为正方形等等;

def consumeWhile(total):
    # 表达相邻两层之间的数量关系
    # cur,upper = layers(1),layers(2)
    # upper变量是从 1-n 层共有多少cube
    cur,layer = 0,0
    while cur <= total:
        cur += layersSum(layer)
        if cur == total:
            return layer,0
        elif cur > total:
            return layer-1,total - (cur-layersSum(layer))
        layer += 1
        
        
total = 100000000
print(consumeWhile(total))

(842, 153956.0)

递归的写法优雅而有趣,但实际项目工程中并不是首选。正如在while循环中看到当 total 数字很大时,递归的不仅运算花费的时间多且易溢出而报错。

这时循环的写法系统的开销更少。

本文由 mdnice 多平台发布

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

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

相关文章

4G模块驱动移植

一、4G模块概述 1、调试的模块型号是广和通的 NL668-EAU-00-M.2。 2、使用的接口是 M.2 Key-B。实际只用到了M2里的USB接口。 调试过程 以QMI_WWAN号方式进行说明&#xff0c;其他拨号方式也试过。最后以QMI_WWAN方式调通了&#xff0c;拨号成功了。 其他拨号方式因为现有文档…

上四休三,未来的期许

近日“少上一天班&#xff0c;究竟香不香”引发关注&#xff0c;英国媒体2月21日报道&#xff0c;一项全世界目前为止参加人数最多的“四天工作制”试验&#xff0c;不久前在英国取得了成功。很多人表示上过四天班之后&#xff0c;给多少钱也回不去五天班的时代了。 来百度APP畅…

【Vue入门】语法 —— 插值、指令、过滤器、计算属性、监听器

目录 一、模版语法 1.1 插值 1.1.1 文本 1.1.2 html解析 1.1.3 属性 1.1.4 表达式 1.2 指令 1.2.1 核心指令 1.2.3 动态参数 二、过滤器 2.1 局部过滤器 2.2 全局过滤器 三、计算属性 四、监听器 五、排座案例 小结&#xff1a;计算属性和监听属性的区别 一、模…

Linux ____02、Linux开关机、目录介绍、文件目录相关命令(常用命令)

Linux开关机、目录介绍、目录相关命令&#xff08;常用命令&#xff09; 一、Linux开关机二、目录介绍三、目录相关命令&#xff08;常用命令&#xff09;1、ls命令&#xff0c;列出目录内容2、cd命令&#xff0c;切换目录&#xff1b;pwd&#xff0c;查看当前工作路径3、mkdi…

fire-voc 火光 烟火 火灾 目标检测数据集

一年中最容易引发火灾的季节是在冬季&#xff0c;主要原因有这样几点。 1、秋冬季节,随着用火、用电、用气增加,加上天气干燥,棉花、木材 、衣物等物体内含有的水分也较低。2、秋冬季风力较大,一旦有火苗冒起就很容易随风蔓延,是火灾的高发期。3、春季也是火灾多发季节&#x…

malloc是如何实现内存分配的?

文章目录 前言一、malloc实现原理概括&#xff1f;二、brk() 函数与mmap()函数三、mmap实现原理普通读写与mmap对比mmap内存映射实现过程mmap 的适用场景 前言 在C和C中&#xff0c;malloc函数是用于动态分配内存的常用函数。本文将深入探究malloc函数的内存分配实现机制&…

背靠背 Nature 新方向 - 蛋白质结构家族图谱的“潘多拉魔盒”

NBT - Foldseek快速准确搜索结构相似的蛋白&#xff0c;AlphaFold蛋白质数据库提供了一个快速的搜索工具 AlphaFold的极限:高中生揭示人工智能在生物信息学挑战中的缺陷AlphaFold2开源了&#xff0c;不是土豪也不会编程的你怎么蹭一波&#xff1f; 对蛋白结构的大规模分析揭示了…

对抗网络爬虫:反爬虫技术与策略详解

&#x1f482; 个人网站:【工具大全】【游戏大全】【神级源码资源网】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 寻找学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】 在今天的互联网世界中&a…

机器学习入门与实践:从原理到代码

&#x1f482; 个人网站:【工具大全】【游戏大全】【神级源码资源网】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 寻找学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】 在本文中&#xff0c;我…

PDF编辑内容怎么做?这几个方法快来了解

PDF&#xff08;便携式文档格式&#xff09;是一种常用的文档格式&#xff0c;但有时我们需要对PDF文件进行编辑&#xff0c;那么小伙伴们知道PDF编辑内容怎么做吗&#xff1f;下面将介绍几种编辑PDF的方法以及注意事项。 1.使用手机编辑PDF文档 最近有个小伙伴说由于工作经常…

模拟实现C语言--strcpy函数

模拟实现C语言–strcpy函数 文章目录 模拟实现C语言--strcpy函数一、strcpy函数是什么&#xff1f;二、使用示例三、模拟实现 一、strcpy函数是什么&#xff1f; strcpy函数是将字符串中的内容复制到另一个字符串中使用的库函数 char* strcpy(char * destination, const char…

【LeetCode热题100】--15.三数之和

15.三数之和 注意&#xff1a;最后答案中不能包含重复的三元组 使用排序双指针 可以使用三重循环枚举三元组&#xff0c;但是需要哈希表进行去重操作&#xff0c;得到不包含重复三元组的最终答案&#xff0c;消耗量大量的时间和空间 对于不重复的本质&#xff0c;保持三重循环…

【Linux学习笔记】 - 常用指令学习及其验证(下)

前言&#xff1a;本文延续上一篇文章【Linux学习笔记】 - 常用指令学习及其验证&#xff08;上&#xff09;对常用的指令进行介绍和验证。 一、mv指令 &#xff08;1&#xff09;功能&#xff1a;用来移动文件或者将文件改名 &#xff08;2&#xff09;语法及验证&#xff1a…

【QT--使用百度地图API显示地图并绘制路线】

QT--使用百度地图API显示地图并绘制路线 前言准备工作申请百度地图密钥(AK)安装开发环境 开发过程新建项目ui界面GPSManager类主窗口Map 效果展示 前言 先吐槽一下下&#xff0c;本身qt学的就不咋滴&#xff0c;谁想到第一件事就是让写一个上位机工具&#xff0c;根据CAN总线传…

OJ练习第177题——打家劫舍 IV(二分查找)

打家劫舍 IV 力扣链接&#xff1a;2560. 打家劫舍 IV 题目描述 沿街有一排连续的房屋。每间房屋内都藏有一定的现金。现在有一位小偷计划从这些房屋中窃取现金。 由于相邻的房屋装有相互连通的防盗系统&#xff0c;所以小偷 不会窃取相邻的房屋 。 小偷的 窃取能力 定义为…

人脸修复祛马赛克算法CodeFormer——C++与Python模型部署

一、人脸修复算法 1.算法简介 CodeFormer是一种基于AI技术深度学习的人脸复原模型&#xff0c;由南洋理工大学和商汤科技联合研究中心联合开发&#xff0c;它能够接收模糊或马赛克图像作为输入&#xff0c;并生成更清晰的原始图像。算法源码地址&#xff1a;https://github.c…

同步 -- 互斥锁

本篇文章基于Linux-6.5源码 建议&#xff1a;搭配Linux源码观看更佳 struct mutex {atomic_long_t owner;spinlock_t wait_lock; //自旋锁&#xff0c;该自旋锁的作用是保护后面的等待队列的原子性struct list_head wait_list; //等待队列 }; API接口 mutex_init 互斥锁初…

C语言入门Day_22 初识指针

目录 前言&#xff1a; 1.内存地址 2.指针的定义 3.指针的使用 4.易错点 5.思维导图 前言&#xff1a; 之前我们学过变量可以用来存储数据&#xff0c;就像一个盒子里面可以放不同的球一样。 这是一个方便大家理解专业概念的比喻。 在计算机世界里面&#xff0c;数据实…

海外ASO优化之提高应用曝光度的技巧1

作为应用程序的开发者&#xff0c;如何使我们的应用在众多竞争对手中脱颖而出&#xff1f;如何应用在App Store搜索中排名更高&#xff0c;以确保它符合App Store搜索中的搜索意图&#xff1f;这些都是我们要重点考虑的。 1、做好应用程序描述。 在填写应用描述之前&#xff0…

直线模组的常用语

在工业生产中&#xff0c;直线模组的叫法有很多种&#xff0c;对于新手小白来说&#xff0c;很容易就会被绕晕&#xff0c;今天我们就来简单说一下直线模组的常用称呼吧&#xff01; 1、直线模组&#xff1a;与直线滑台同义&#xff0c;基本可以相互互换。直线模组一般是指可以…