首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

循环、递归与魔术(一)——递归与循环的数理逻辑

我想,它用展开的一列扑克牌来表达其意思应该再合适不过了: 图6 扑克牌序列与循环 而递归其实是一种参数化简,形式不变的一种化归思想。...…,当时我就惊讶于这种无限循环的图是怎么画出来的?...这对应的恰好就是我们在面对类似的样本序列或者迭代求值时候所需要的逻辑,其中前者往往是固定循环次数,前后无关联还可以并行;后者则有可能难以确定循环次数。...所以代码建议中,都建议直接写循环而不是递归,但是,递归确是一种更高级的逻辑,有时能够使得代码简洁漂亮。这就看如何把代码可维护调试和效率进行折中了。我们每个人懂得太少,都需要去依赖太多的底层。...好了,关于递归,循环的数理和程序逻辑就先介绍到这里,后面的文章会从魔术艺术的角度对这两个概念进行拓展,看看这些基本的数理逻辑的影子是如何在艺术中体现的。

1.4K21

for循环与串行化、并行化Stream流性能对比

在现实当中,并行化流开始并没有引起我的注意,直到我发现了它的应用场景后才发现,并行化流在提高性能以及编码难易程度上,代码bug上似乎要更胜一筹。...“第三章 Stream流”一直介绍的是串行化的流,串行化的流如果你有心可以和for循环对比,会发现串行化的流在性能上是比for循环要差的。这也是部分人“鄙视”Stream流的一点。...我们分别举几个数据量不同的例子,来说明for循环、串行化Stream流、并行化Stream流的性能在我本机的性能。 ?...从曲线图可以看出90000个学生以前3者的性能都是几毫秒,并没有太大区别,从90000个学生过后,串行化流性能主键走弱,并行化流的性能开始逐渐赶上for循环,但注意这并不意味着从900000个数据后并行化的数据就一定会超越...并行化流受CPU核数的影响,在本机2核下,在数据量小的情况下性能略高于串行化流,略低于for循环,在数据量中的情况下差不多,在数据量比较大时性能最差,但当数据量特别大时,性能也变得更好。

1.1K10
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    递归与循环的效率迷思

    本文简单比较了一下相同逻辑下,递归实现和循环实现的效率差异 已经不记得最初是从哪里获取的信息了,自己总有一个印象是递归的效率比循环差,因为递归有很大的函数调用开销,再加上递归可能存在的堆栈溢出问题...64% 左右了 ~ 试验到现在,似乎都印证了我之前的印象: 递归比循环慢,写代码就要写循环~ 我们最后来看个真实的(也更复杂的)示例:查找指定名字的子节点(假设我们有一颗树形结构的节点树,给出根节点,...,似乎我们应该将之前的递归代码改写为这种循环形式,但是 Profile 之后发现,其实循环版本还略慢于递归版本,原因就在于(模拟)调用栈的引入抵消了(甚至超过了)函数调用的开销....C++ 中实现的循环版本还要显著慢于其递归版本....还有一个问题之前没有提及,就是代码可读性问题,从我个人经验来讲,递归代码的可读性大体上还是要优于循环代码的.

    1.4K20

    Java并发编程学习18-线程池的使用(递归算法的并行化改进)

    引言 上篇介绍了 ThreadPoolExecutor 配置和扩展相关的信息,本篇开始将介绍递归算法的并行化。...当串行循环中的各个迭代操作之间彼此独立,并且每个迭代操作执行的工作量比管理一个新任务时带来的开销更多,那么这个串行循环就适合并行化。 2....串行递归转并行递归 在递归的算法中通常都会存在串行循环,这就可以用上面 1 中的方式进行并行化。...如果在每个迭代操作中,都不需要来自后续递归迭代的结果,那可以参考下面的 parallelRecursive 方法来对递归进行并行化改进: public class Process { /**...既然上面树节点计算已经并行,那么 sequentialRecursive 方法的调用者该如何获取所有的结果呢???

    12421

    spring:我是如何解决循环依赖的?

    1.由同事抛的一个问题开始 最近项目组的一个同事遇到了一个问题,问我的意见,一下子引起的我的兴趣,因为这个问题我也是第一次遇到。...平时自认为对spring循环依赖问题还是比较了解的,直到遇到这个和后面的几个问题后,重新刷新了我的认识。...而多例即SCOPE_PROTOTYPE类型的类,非单例,不会被提前初始化bean,所以程序能够正常启动。 如何让他提前初始化bean呢?...这就要从spring的bean加载顺序说起了,默认情况下,spring是按照文件完整路径递归查找的,按路径+文件名排序,排在前面的先加载。...答案在AbstractBeanFactory类的doGetBean方法的这段代码中: ? 它会检查dependsOn的实例有没有循环依赖,如果有循环依赖则抛异常。 4.出现循环依赖如何解决?

    17.2K105

    循环、递归与魔术(五)——再谈递归的魔术逻辑与欣赏

    在前面的系列文章里,我们谈到了循环和递归的数理逻辑和魔术艺术逻辑,今天我们就递归的魔术逻辑,通过一个优雅的魔术,来最后对整个系列做一个收尾。...如果不熟悉前面的文章,建议可以先回顾一下: 循环、递归与魔术(四)——递归的魔术逻辑初探与欣赏 循环、递归与魔术(三)——再谈循环的魔术逻辑与欣赏 循环、递归与魔术(二)——循环的魔术逻辑浅析与欣赏...循环、递归与魔术(一)——递归与循环的数理逻辑 在上一篇也提到了,递归的逻辑其实是一种自相似的化归,可以无尽推导下去,有一个极限,而在魔术中,在观众的期待下,去顺势而为地挑战这个极限,就变得很有意思了...这一个也一样,如果表演得当,是非常唯美,柔和的,并在其中带有着别样的神秘韵味。 就像在代码实现中,循环和递归就可以相互转化一样。...在艺术作品里,循环和递归的结构本身并没有明显的界限,也可以相互转化着来理解。

    60310

    一、简单使用二、 并行循环的中断和跳出三、并行循环中为数组集合添加项四、返回集合运算结果含有局部变量的并行循环五、PLinq(Linq的并行计算)

    我们会用到的方法有For,ForEach,Invoke。 一、简单使用 首先我们初始化一个List用于循环,这里我们循环10次。...在ParallelEnumerable中提供的并行化的方法 ParallelEnumerable 运算符 说明 AsParallel() PLINQ 的入口点。指定如果可能,应并行化查询的其余部分。...WithDegreeOfParallelism() 指定 PLINQ 应当用来并行化查询的处理器的最大数目。...WithMergeOptions() 提供有关 PLINQ 应当如何(如果可能)将并行结果合并回到使用线程上的一个序列的提示。...WithExecutionMode() 指定 PLINQ 应当如何并行化查询(即使默认行为是按顺序运行查询)。

    2.6K61

    循环、递归与魔术(四)——递归的魔术逻辑初探与欣赏

    在前面的系列文章里,我们谈到了循环和递归的数理逻辑和以及循环的魔术艺术逻辑,今天我们进入最后一个议题——递归的魔术逻辑。...相关历史文章请戳: 循环、递归与魔术(三)——再谈循环的魔术逻辑与欣赏 循环、递归与魔术(二)——循环的魔术逻辑浅析与欣赏 循环、递归与魔术(一)——递归与循环的数理逻辑 递归的魔术逻辑 递归在形态上表示为自相似...它和递归与一般化归的区别一样,递归是化为一个规模变小的自己,可以不断进行下去,而化归完全化为另一个问题,是一次性的智慧。 接下来我们来看相关魔术作品。...但是由于实在太损牌了,我在一般表演中也就略去了,但这绝对是个绝妙的想法! 最后我们回到我们今天的重点结构——递归。如果手法和错引是砖和连接他们的水泥,那么整体构成的递归结构就是这个作品的蓝图和框架。...今天的文章就先写到这里,通过一个绝妙设计的4 Ace长流程和经典的阴魂不散来说明了递归逻辑在魔术艺术中的改良和升华。我自己也是通过实例来总结出来的这些概念加以理解,又反过来帮助我设计和理解更好的流程。

    73420

    为什么我要说:柯里化 == 闭包+递归?

    于是乎,我们设想,能不能写一个这样的函数:它的功能,就是“加”,参数跟几个,我就加几个。...(n) // n 数相加 没错,这个函数就是:柯里化!!(或者说这个过程叫柯里化,这个思想叫柯里化,本瓜认为这里不需要太死扣定义) 接着,我们一步步来试试,它会是怎样构成的?...,聪明的你一定就明白了,这样一直写下去,不就是递归吗?!...以上,用最简单的代码解释了 —— 为什么我说:柯里化 == 闭包+递归 ? 柯里化是一种思想,上面的 addCurry 可以说是最简单的一种实践。...如果以后有人再问你柯里化,可以往这个方向上答。。。 OK,以上便是本篇分享。 觉得不错点个赞吧,您的鼓励,我的动力,坚持原创质量好文~~ 欢迎评论留言 我是掘金安东尼,输出暴露输入,技术洞见生活。

    28630

    【说站】java循环和递归的区别

    java循环和递归的区别 说明 1、一般递归调用可以处理的算法,也通过循环去解决常需要额外的低效处理 。 2、 现在的编译器在优化后,对于多次调用的方法处理会有非常好的效率优化,效率未必低于循环。...循环 优点: 结构简单 缺点: 并不能解决所有的问题。 有的问题适合使用递归而不是循环,如果使用循环并不困难的话,最好使用循环。...递归     优点: 代码简洁、清晰,并且容易验证正确性 缺点: 它的运行需要较多次数的方法调用,如果调用层数比较深,需要增加额外的堆栈处理,比如参数传递需要压栈等操作,会对执行效率有一定影响。...但是,对于某些问题,如果不使用递归,那将是极端难看的代码。 以上就是java循环和递归的区别,希望对大家有所帮助。

    62230

    循环、递归与魔术(二)——循环的魔术逻辑浅析与欣赏

    在上一篇中,我们讲了循环和递归的数学和计算机概念,并举例说明其是一种在生活中的无处不在的结构。...相关回顾: 循环、递归与魔术(一)——递归与循环的数理逻辑 上期在谈到递归与循环的程序逻辑时,循环遍历树的代码换行出现了换行错乱,这里再贴一遍: BFSTree(Tree tree) { vector...),tree_list[i].child_list.begin(), tree_list[i].child_list.end()); } tree_list = new_tree_list; } } 循环和递归的概念是科学上的...就像上一讲中提到的那些艺术画,建筑元素一样,循环与递归的基本元素肯定是能够造就美感的。这种相似性的结构无论从直观上还是深层地构造一个艺术概念上都是绝佳的元素。但是要应用的话,也绝不是生搬硬套。...今天这一篇我们来着重分析循环结构在魔术中的应用,重点看其基本逻辑在魔术等艺术形式中的变形与升华。后面我们继续深入分析循环的更多应用,然后进入递归结构继续。

    75020

    【我和Python算法的初相遇】——体验递归的可视化篇

    递归的起源 递归是一种算法,它利用函数的自身调用来解决问题。递归的历史可以追溯到古代的数学家和逻辑学家,如希腊哲学家亚里士多德和印度数学家阿耶尔巴塔。...在20世纪初,数学家David Hilbert提出了“希尔伯特问题”,其中包括一个著名的问题——哥德尔不完备定理。这个定理表明,任何一个形式化的系统都无法证明自身完备。...问题: 给定一个列表,返回所有数的和列表中数的个数不定,需要一个循环和一个累加变量来迭代求和 def Listsum(nl): sum = 0 for i in nl:...sum += i return sum print(Listsum([1,2,3,4])) 利用递归解决列表求和问题 程序很简单,但假如没有循环语句 ?...—— 我们通过递归可以将复杂问题简单化,并且我们还学习了如何通过递归进行进制转换,以及如何通过递归去画出我们想要的图形---螺旋图,分形树,谢尔基三角形。

    30110

    为什么你学不会递归?告别递归,谈谈我的经验

    少侠,请继续看,我下面还会讲如何优化递归。当然,大佬请随意,可以直接拉动最下面留言给我一些建议,万分感谢!...这也是我要和你们说的,关于递归结束条件是否够严谨问题,有很多人在使用递归的时候,由于结束条件不够严谨,导致出现死循环。...就像上面,f(n-2)这个函数的调用,有可能出现 f(0) 的情况,导致死循环,所以我们把它补上。...递归调用的状态图如下: 看到没有,递归计算的时候,重复计算了两次 f(5),五次 f(4)。。。。这是非常恐怖的,n 越大,重复计算的就越多,所以我们必须进行优化。 如何优化?...代码如下: // 我们实现假定 arr 数组已经初始化好的了。

    83330

    递归是什么?如何优化?递归的理解总结

    这是我参与「掘金日新计划 · 10 月更文挑战」的第13天,点击查看活动详情 递归 在算法刷题中,往往会使用到递归方法解题,虽然递归将一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,...递归的要点: 找到原问题的子问题,推导出解决问题的递推式。 找到递归的出口,即终止(边界)条件。 递归的写法: 按照递归的要点,把原问题拆解成子问题,推导出递推式。再描述出终止条件,释放递归的出口。...n=0,n=1的时候 if (n==0) return 0; if (n<2) return 1; 递归代码就可以写成这样 int dp(int n) { if (n==0) return 0; if...(n<2) return 1; return dp(n-1) + dp(n-2); } 递归优化(记忆化搜索) 对于同一个子问题,递归会对此再次进行计算。...n的元素 递推式:F(n) = 打印F(n) + F(n-1) 终止条件: if (n<0) return; 递归代码就可以这样写: void solution(int[] nums) { print

    14310
    领券