各位老铁们,大家好,今天由我来为大家分享谈论递归、迭代和循环。人懂迭代,神懂递归。,以及的相关问题知识,希望对大家有所帮助。如果可以帮助到大家,还望关注收藏下本站,您的支持是我们最大的动力,谢谢大家了哈,下面我们开始吧!
漫谈递归、迭代、循环
刚开始看递归的时候,之前的一篇体验帖给了我一句大师的名言:人懂迭代,神懂递归。 (迭代是人类的,递归是神圣的。)我正在纠结是否应该学习递归。我只是一个普通人。然后尝试从普通人的角度来理解递归。
汉诺塔问题只能用递归方法解决
维基百科说,递归是一个以自相似方式重复自身的过程。在计算机中,是指在函数的定义中使用函数本身的方法。 “递归”这个词翻译过来就是,recursion-re(重复)+curs(发生),好像就是重复发生的意思。说到递归,大家能想到的词有很多,比如迭代、循环,它们也有递归的意思。
递归:以自相似的方式重复自身,A调用A;递归是一种树结构。这种重复包括两个过程:递归和回归。当递归到达底部时,回归开始。这个过程有点类似于树的深度优先遍历。图片。
迭代:重复反馈过程的活动,每次迭代的结果将作为下一次迭代的初始值,A调用B;递归是一个环结构,从初始状态开始,每次迭代遍历环并更新状态,如此迭代直至结束状态。
图形递归
计算n的阶乘,先看递归实现代码
递归的三个要素必须是:
1.明确递归终止条件
2. 给出递归终止时的解。
3. 提取重复逻辑并缩小问题规模
int func (int n) { if (n==1)////清除递归终止条件return 1;//如何处理递归终止else { return n*func(n – 1);//提取重复逻辑,减小问题的大小}}//代码运行时,func(n)-func(n-1)-.func(3)-func(2)-func(1),不断调用函数本身。图形迭代
计算n的阶乘,看迭代实现代码:
int func(int n){ int result=1;//初始变量,有初始值for(int i=2; i n; i++)//结束条件{ result *=i;//变量如何取值的规则are Updated } return result; }//与递归相比,迭代不会调用自身。迭代必须存在三个元素:
1. 具有初始值的初始变量
2.一条解释变量值如何更新的规则
3. 结束条件
从这里可以看出,迭代和循环非常相似。我们来看看如何使用循环来计算n的阶乘:
int func(int n){ int result=n;//初始变量有初始值while(n 1)//结束条件{ n–; result=result * n//解释变量值如何更新的规则} return result; }//与迭代相比,循环可以是常量重复和变量重复。迭代是一个变化的循环,轮流发生;循环分为常量重复和变量重复。
递归其实是为了让程序员更容易,让CPU更难。递归是利用栈机制实现的。每深入一层,就占用一个栈数据区。如果递归程序是用循环实现的,一般要自己维护一个栈,方便状态回溯。递归程序的目的是利用系统上函数本身的自动变量来记录状态,以便回溯。递归的优点是易于理解和编程;缺点是对于一些嵌套层次较深的算法,内存空间会不足,大量的函数调用也会造成大量额外的时间开销。循环的缺点是不容易理解,难以写出复杂的问题;优点是效率比较高,运行时间只因为循环次数的增加而增加,并且没有额外的空间开销。
递归的应用场景
1.问题的解法是递归的。汉诺塔问题只能用递归方法解决。
2、问题的定义是递归定义的,比如阶乘、斐波那契函数。
3.数据结构是递归的,比如链表和树操作,包括树遍历(前序、中序、后序)
二叉树的遍历使用递归和循环实现
树本身是递归定义的,所以采用递归的方法来实现遍历。代码简洁易懂,但开销比较高;使用循环方法实现遍历时,必须使用栈来模拟实现。
使用递归的方法按顺序遍历二叉树。 Preorder表示根顺序在前,根节点-左子节点-右子节点。
原创文章,作者:小su,如若转载,请注明出处:https://www.sudun.com/ask/185443.html
用户评论
桃洛憬
每次看到这两个词就觉得头疼,还是老老实实用循环吧!代码写出来也比递归好理解多了!
有10位网友表示赞同!
大王派我来巡山!
同意!迭代简单直观,递归总是让我看着看着就晕头转向的。也许我是不会编程的天选之子?
有11位网友表示赞同!
﹏櫻之舞﹏
我觉得这个标题很有意思,我一直在想迭代和递归之间有什么本质区别,为什么人类难以理解递归呢?有没有一种方法可以让我们更容易理解递归的概念呢?
有12位网友表示赞同!
海盟山誓总是赊
对于“循环人理解迭代”我觉得很认同,因为我们日常生活中很多事情都是迭代完成的。比如学习一门新语言,从入门到精通就是一个循序渐进的过程。而递归则像是解决问题的分解,就像拆解一个复杂玩具一样。很难一下子看懂整体结构。
有16位网友表示赞同!
优雅的叶子
这篇文章写的太好了!对于刚接触编程的人来说,的确容易被递归的思想所困扰。迭代的方式更容易理解和执行,但学习递归能让我们掌握更强大的程序设计思维,毕竟很多算法都需要用到递归来解决。
有5位网友表示赞同!
减肥伤身#
我个人觉得理解递归并不比理解迭代难,只是递归需要更抽象的思维方式来理解的问题背后的逻辑。就像看一部电影一样,有些情节表面上看起来很复杂,但只要认真分析了每一帧画面和人物之间的关系,就能明白故事的核心。递归也是如此。
有20位网友表示赞同!
陌颜
这篇文章虽然很有意思,但是感觉没有给出太具体的例子说明迭代和递归的区别,对我来说理解起来还是不够清晰…
有19位网友表示赞同!
莫失莫忘
学习编程的确需要多看一些文章,多练习代码才能真正掌握。这个标题很吸引人,让我对递归和迭代的本质的区别产生了更深层次的思考。
有5位网友表示赞同!
墨染天下
我曾经尝试用递归解决一个问题,结果代码写得越来越复杂,最后还是放弃了,改用迭代的方式写的简洁很多…
有15位网友表示赞同!
巷口酒肆
每次看到循环和递归就想说一句:递归太狠了!就像是在不断无限地重复同一件事。不过,有些问题确实只能依靠递归来解决,比如树形结构的遍历算法等等。
有16位网友表示赞同!
麝香味
其实无论是递归还是迭代,最终都是为了实现问题的解题效果,选择哪种方式取决于具体的问题类型和个人的编程习惯。当然,学习更多的编程技巧并不会害了我们!
有16位网友表示赞同!
淡抹烟熏妆丶
我觉得算法设计真的很有乐趣,不同的解决方法会带来截然不同的代码风格和效率. 学习递归能开拓思维范围,提升编程水平, 即使最终还是用迭代实现!
有18位网友表示赞同!
别留遗憾
对于编程新手来说,先掌握循环的思想很重要,毕竟这是最基本的逻辑操作。等对编程基础有了一个初步的了解之后,再慢慢学习递归,我相信一切都会顺其自然。
有6位网友表示赞同!
素颜倾城
同意啊!在一些复杂的任务中,递归方法可以使代码更简洁优雅。但同样需要注意,递归会导致内存栈溢出问题,需要谨慎使用。所以,无论是迭代还是递归,都要根据实际情况进行选择和优化。
有9位网友表示赞同!
闷骚闷出味道了
文章很有深度了! 让我重新思考了如何理解迭代和递归两种编程模式的区别。"神理解递归" 这句话真的是太有含义了,看来要像 "神" 一样才能真正明白递归的奥妙之处!
有11位网友表示赞同!
猫腻
感觉这个标题说的很形象,人类思维习惯于循序渐进的迭代方式,而递归是一种更高层次的抽象思维。学习编程,不止是写代码,更是一种认知提升的过程
有18位网友表示赞同!