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

递归和迭代

一.递归(Recursion) 1.递归:以相似的方式重复自身的过程 2.递归在程序中表现为:在函数的定义中直接或间接调用函数自身 3.递归和循环: (1)递归是有去(去)有回(归来),因为存在终止条件...,比如你打开一扇门还有一扇门,不断打开,最终你会碰到一面墙,然后返回 (2)循环是有去无回,但可以设置终止条件,比如你打开一扇门还有一扇门,不断打开,还有门,没有终点 4.递归的去和归来: (1)递归的去...: (2)递归树 (3)主方法:不是所有情况都包括 二.迭代 1.迭代:是一种为了逼近所需目标或结果,不断用变量的旧值递推新值的过程 2.迭代在程序中的表现:函数不断调用原函数的返回值...4.迭代和递归 (1)迭代:函数内某段代码实现循环,函数调用时使用前一次循环的返回值作为初始值,A调用B,使5用计数器结束循环 (2)递归:重复调用自身实现循环,A调用A,设置结束条件 (3)递归中一定有迭代...,但是迭代中不一定有递归,大部分可以相互转换.能用迭代的不用递归, 5.迭代在程序中的表示: (1)必须设置计数器,可以通过计数设置或条件设置,否则会一直迭代 (2)必须有返回值可以作为再次迭代的初值

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

经典递归问题--汉诺塔(java实现)

2.递归过程的详细解释 我们通常能够看懂简单的递归代码,但是自己上手写的时候却总是想不到思路,这是因为我们对递归的理解不够深入; 下面是对递归的深入理解: 递归是一个整体的动作 递归中 和 归...分别是两个独立的过程 --> 开辟函数栈帧, 归 --> 销毁函数栈帧 程序执行递归的的过程 是先后归的过程, 也是不断开辟函数栈帧把参数传递过去 ;同时不断返回数值,然后销毁函数栈帧的过程...(关于什么是函数栈帧可以看我的相关博客:http://t.csdnimg.cn/opIPf 的最后部分内容 ) 下面是图例解释: 我们在上述图片可以看到: 红色箭头所指部分均是...“过程” 蓝色箭头所指向的部分 均是归过程 而函数栈帧内 就说我们常说的 方法体,也可以叫做递推公式 二、汉诺塔问题 在了解完递归的原理之后,我们来解决一下汉诺塔的问题 1.汉诺塔(hanoi)的介绍...B柱(这里B柱表示的是过度柱),再把最下面的柱子 A->C 剩下的问题就是把 剩下N-1个柱子 B 移动到C 了 到这里大家是不是感觉有点熟悉了;我们要把移动这 N-1个盘子 只需要把 上面的 (

13210

递归详解

函数调用单项的一层层 下去,然后通过最终的return条件,再一层层的return回去( 归 )。 递归实现的阶乘很好理解,那咱们就趁热打铁总结一下递归的特点: 1....好,那咱们的终止条件其实就出来了,假设n表示当前还剩多少阶台阶,返回值表示有几种走法: if(n = 1) return 1;此时只有一种走法; if(n = 2) return 2;此时有两种走法。...对于咱们这个问题,如果想要展开的过程,那么就会像二叉树一样不断延展开来,然而这个展开的过程对于我们来说没有任何意义,因为这本身就是重复的过程, 这种事不应该是我们人脑该做的 。...Exception in thread "main" java.lang.StackOverflowError 2、重复执行 这个问题算是递归中比较重点的缺点。...每次执行的时候先去缓存里读,没有的话再执行的过程。 四、非递归实现 这里有一个非递归的实现。

48320

递归

函数调用单项的一层层 下去,然后通过最终的return条件,再一层层的return回去( 归 )。 递归实现的阶乘很好理解,那咱们就趁热打铁总结一下递归的特点: 1....好,那咱们的终止条件其实就出来了,假设n表示当前还剩多少阶台阶,返回值表示有几种走法: if(n = 1) return 1;此时只有一种走法; if(n = 2) return 2;此时有两种走法。...对于咱们这个问题,如果想要展开的过程,那么就会像二叉树一样不断延展开来,然而这个展开的过程对于我们来说没有任何意义,因为这本身就是重复的过程, 这种事不应该是我们人脑该做的 。...Exception in thread "main" java.lang.StackOverflowError 2、重复执行 这个问题算是递归中比较重点的缺点。...每次执行的时候先去缓存里读,没有的话再执行的过程。 四、非递归实现 这里有一个非递归的实现,同样也来自 极客时间《数据结构于算法之美》。

1K65

算法渣-递归算法

归中的“”就是入栈,递进;“归”就是出栈,回归 规模大转化为规模小是核心思想,但递归并非是只做这步转化,而是把规模大的问题分解为规模小的子问题和可以在子问题解决的基础上剩余的可以自行解决的部分。...因为是描述问题,归是解决问题。而我的大脑容易被占据,只往远方去了,连尽头都没走到,何谈回的来 递归就是有去(去)有回(归来) 为什么可以”有去“?...这要求这些问题不断大到小,近及远的过程中,会有一个终点,一个临界点,一个baseline,一个你到了那个点就不用再往更小,更远的地方走下去的点,然后从那个点开始,原路返回到原点 递归三要素 用程序表达出来...,确定了三个要素: + 结束条件 + 归 function recursion(大规模){ if (end_condition) { end; } else

71830

零学习python 】26. 函数参数与返回值的应用

test(b=1,2) # 关键字参数写在位置参数之前会导致出错 四、小总结 定义时小括号中的参数,用来接收参数用的,称为 “形参” 调用时小括号中的参数,用来传递给函数用的,称为 “实参” 函数返回值...(一) 一、“返回值”介绍 现实生活中的场景: 我给儿子10块钱,让他给我买个冰淇淋。...,只有调用者拥有了这个返回值,才能够根据当前的温度做适当的调整 综上所述: 所谓“返回值”,就是程序中函数完成一件事情后,最后给调用者的结果 使用返回值的前提需求就是函数调用者想要在函数外使用计算结果...,最后儿子给你冰淇淋时,你一定是儿子手中接过来 对么,程序也是如此,如果一个函数返回了一个数据,那么想要用这个数据,那么就需要保存 保存函数的返回值示例如下: #定义函数 def add2num(a,...b): return a+b #调用函数,顺便保存函数的返回值 result = add2num(100,98) #因为result已经保存了add2num的返回值,所以接下来就可以使用了

10710

【linux】信号的保存和达处理

那么实际执行信号的处理动作称为信号达;信号产生到达之间的状态,称为信号未决(Pending)。进程可以选择阻塞 (Block )某个信号。         ...handler_t 其实是函数指针类型,typedef void(*handler)(int signo); 参数是信号编号,返回值是void的函数指针。...是内核态返回到用户态!哦吼,那什么是用户态和内核态呢?...那什么时候用户态切换到内核态呢?系统调用的最开始。(根据 Int 80(汇编代码),会把寄存器中的进程运行级别状态修改。...---- 4.3 volatile关键字         我们在读取变量的值时,一般会内存中读取,但是由于编译器的优化,就会将内存中的值加载到cpu的寄存器中,从而之后访问该变量的值只会寄存器中读取

15920

进程信号

#include void abort(void); 就像exit函数一样,abort函数总是会成功的,所以没有返回值。...这个函数的返回值是0或者是以前设定的闹钟时间还余下的秒数。如果seconds值为0,表示取消以前设定的闹钟,函数的返回值仍然是以前设定的闹钟时间还余下的秒数。 例如: ?...阻塞信号 信号其他相关常见概念 实际执行信号的处理动作称为信号达 信号产生到达之间的状态,称为信号未决 进程可以选择阻塞某个信号。...被阻塞的信号产生时将保持在未决状态,直到进程解除对此信号的阻塞,才执行达的动作 注意,阻塞和忽略是不同的,只要信号被阻塞就不会达,而忽略是在达之后可选的一种处理动作。...因为硬件中断使进程切换到内核,再次回用户态之前检查到有信号待处理,于是切换 到sighandler函数,sighandler也调用insert函数向同一个链表head中插入节点node2,插入操作的 两步都做完之后sighandler

1.3K20

Linux进程信号【信号保存】

---- 前言 信号产生到执行,并不会被立即处理,这就意味着需要一种 “方式” 记录信号是否产生,对于 31 个普通信号来说,一个 int 整型就足以表示所有普通信号的产生信息了;信号还有可能被 “阻塞...信号产生(Produce):由四种不同的方式发出信号 信号未决(Pending):信号 产生 到 执行 的中间状态 信号达(Delivery):进程收到信号后,对信号的处理动作 在这三种过程之前,...),依然可以将其 阻塞 至于 handler 表是一个 函数指针表,格式为:返回值为空,参数为 int 的函数 可以看看 默认动作 SIG_DEL 和 忽略动作 SIG_IGN 的定义 /* Type...block 表 进行操作 #include int sigprocmask(int how, const sigset_t *set, sigset_t *oldset); 返回值...需要借助 未决信号表 2.3、sigpending 这个函数很简单,获取当前进程中的 未决信号集 #include int sigpending(sigset_t *set); 返回值

18420

【再谈递归】递归理解了,该如何去写程序

如果你理解了递归,那么你就成功了一半 递归分为两个部分,“”和“归” 递归递归先再归。 可能很多同学对递归还不了解,那我在这里来说一说:何为递归。 何为递归?...山里有 … 所以,递归的特点之一:函数自己调用自己 不过像上述“老和尚讲故事”的案例,通常称为 单程递归 (这个概念来自于 刘慈欣的《星际战争》第11章),所谓单程递归,就是没有返回的递归,也就是只有,...用好递归 前面说到,递归是有返回值的,所以,我们在写递归的时候,不妨设它是一个已经写好了的函数,我们只需要知道他返回的结果是多少不就可以了吗。...调用fib(n-1)+fib(n-2)时,我们如果带进去算,会陷入循环中,循环到底回来的时候,还要记录返回值,对于计算机来说,有手就行,但对于我们普通人来说,特别绕(特别是当输入的n很大时),我们不妨假设已经知道它的返回值来运行

48353

linux系统编程之信号(三):信号的阻塞与未决

一、信号在内核中的表示 实际执行信号的处理动作称为信号达(Delivery),信号产生到达之间的状态,称为信号未决(Pending)。...被阻塞的信号产生时将保持在未决状态,直到进程解除对此信号的阻塞,才执行达的动作。注意,阻塞和忽略是不同的,只要信号被阻塞就不会达,而忽略是在达之后可选的一种处理动作。...信号产生时,内核在进程控制块中设置该信号的未决标志,直到信号达才清除该标志。在上图的例子中, 1. SIGHUP信号未阻塞也未产生过,当它达时执行默认处理动作。 2....二、信号集处理函数 sigset_t类型(64bit)对于每种信号用一个bit表示“有效”或“无效”状态,至于这个类型内部如何存储这些bit则依赖于系统实现,使用者的角度是不必关心的,使用者只能调用以下函数来操作...#include int sigprocmask(int how, const sigset_t *set, sigset_t *oset); 返回值:若成功则为0,若出错则为

2.1K00

Linux系统-进程信号

信号集操作函数 四、捕捉信号 1、内核中的信号捕捉 2、信号捕捉sigaction函数 3、可重入函数 4、volatile关键字 5、SIGCHLD信号 零、前言 本章主要讲解学习Linux中的信号,信号的产生到识别...(Delivery) 信号产生到达之间的状态,称为信号未决(Pending) 进程可以选择阻塞 (Block )某个信号 被阻塞的信号产生时将保持在未决状态,直到进程解除对此信号的阻塞...,才执行达的动作 注:阻塞和忽略是不同的,只要信号被阻塞就不会达,而忽略是在达之后可选的一种处理动作 2、在内核中的表示 信号在内核中的表示示意图: 解释: 每个信号都有两个标志位分别表示阻塞...在上图,SIGHUP信号未阻塞也未产生过,当它达时执行默认处理动作;SIGINT信号产生过,但正在被阻塞,所以暂时不能达。...Mask),这里的“屏蔽”应该理解为阻塞而不是忽略 4、信号集操作函数 sigset_t类型对于每种信号用一个bit表示“有效”或“无效”状态,至于这个类型内部如何存储这些bit则依赖于系统实现,使用者的角度是不必关心的

3.5K10

【Linux】信号>信号产生&&信号处理&&信号保存&&信号详解

如果seconds值为0,表示取消以前设定的闹钟,函数的返回值仍然是以前设定的闹钟时间还余下的秒数 #include #include int main()...(Delivery) 信号产生到达之间的状态,称为信号未决(Pending) 进程可以选择阻塞 (Block )某个信号 被阻塞的信号产生时将保持在未决状态,直到进程解除对此信号的阻塞,才执行达的动作...在上图的例子中,SIGHUP信号未阻塞也未产生过,当它达时执行默认处理动作 SIGINT信号产生过,但正在被阻塞,所以暂时不能达。...Mask),这里的“屏蔽”应该理解为阻塞而不是忽略 3.4 信号集操作函数 sigset_t类型对于每种信号用一个bit表示“有效”或“无效”状态,至于这个类型内部如何存储这些bit则依赖于系统实现,使用者的角度是不必关心的...因为硬件中断使进程切换到内核,再次回用户态之前检查到有信号待处理,于是切换到sighandler函数,sighandler也调用insert函数向同一个链表head中插入节点node2,插入操作的两步都做完之后sighandler

12110

leetcode 递归编程技巧-链表算法题

为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引 0 开始)。如果 pos 是 -1,则在该链表中没有环。...类比:就比如学校操场,A、B两人跑围着操场跑步,A跑的慢,B跑的快,他们开始起跑后,随着时间的推移,最终他们会在操场的某个地点相遇。   ...这就是一个非常标准的递归求解问题的分解过程,去的过程叫“”,回来的过程叫“归"。基本上,所有的递归问题都可以用递推公式来表示。...那么在实际开发中,递归中的代码是怎么运行的了,我们来看下面的代码: func test(index: Int) -> Int{ if index == 0 { return 0}...在文章最后,我想说的是,递归确实很难理解,如果你真的很想掌握它,那就像我一样,写一个test(intdx:int)函数来测试一下,走一遍递归流程,知道是怎么的也知道是怎么归的,动手操作了,相信你一定会有惊喜

32920

揭秘Java方法的返回值void到诸多数据类型,有两下子!

在定义方法时,我们需要定义方法名、参数列表、返回值类型及方法体。其中,返回值类型表示方法返回值的类型,可以是Java基本数据类型,也可以是引用类型,甚至可以是void。...本篇文章将从Java方法返回值的基础类型讲起,逐渐深入探讨Java方法返回值的详细内容。正文1. void类型  void类型是Java中的一种基础数据类型,表示“无返回值”。...在定义方法时,如果希望该方法不返回任何值,则可将返回值类型设为void。...返回值的多态  Java中的继承与多态概念可以拓展到方法的返回值类型。具体来说,如果一个方法的返回值类型是父类或接口类型,那么该方法可以返回其子类或实现类的对象。...总结  本篇文章详细介绍了Java方法的返回值类型,包括基本数据类型、引用类型以及多态的应用。在实际开发中,我们需要根据具体需求选择合适的返回值类型,并保证方法的返回值类型与方法实现的功能一致。

30141
领券