递归调用

~~函数基础(四):递归函数~~

我们两清 提交于 2020-03-17 06:58:35
进击のpython 递归函数 学过数学的可能多多少少听过“递归”这个词 那么递归函数到底是怎么个函数呢? 老样子,从需求找方法! 我想要 100/2 结果继续除2,直到结果为零,然后打印每一步的结果 怎么写呢?可以用循环!对! n = 100 while n > 0: n = int(n / 2) print(n) 要的就是这种结果!但是,总有艮的 就想用函数来解决这个问题 甚至更过分的!还不想用循环! 能做吗?于是就有大 傻子 科学家研究出另一种写法: def func(n): n = int(n/2) print(n) func(100) 这么写还懂是吧 发现,n 这个变量就变成 50 了,然后还是要执行这个函数 也就是说,我可能要多次调用这个函数! 所以,就有了接下来的想法: def func(n): n = int(n / 2) print(n) if n > 0: func(n) func(100) 成功了!那光成功不行啊,咱们得研究研究怎么做到的呢??? 有感觉出循环了吗?通过不断的自我调用,达到了目的 每一次的函数的输出都是基于上次的返回结果! 进阶 总有刁民想害朕! 这不,有人写了这个代码! def func(n): n = int(n / 2) print(n) if n > 0: func(n) print(n) func(100) 和上面的比,就多了一句话

递归(走楼梯,阶乘)

隐身守侯 提交于 2020-03-17 03:51:21
递归我记得,我最先接触的递归的例子是汉诺塔。 但是本文现在不讲汉诺塔,嘿嘿! 我们从简单的开始 递归现象发生于递归函数,递归函数是直接或者间接的调用自己本身的这么一种函数。 举个例子 求从1连成乘到n的积,也就是求 n! 。其中就是重复的去用一个数乘一个数,接着再乘一个数,一直乘到100;我们用递归完成, public int recursion ( int i , int n ) { if ( i == n ) return n ; return i * recursion ( i + 1 ) ; } 函数recursion自己调用自己,这就是递归现象。 递归是一种很棒的算法思想,你只需要找到复杂问题中最小的重复单元或者说可能性单元,然后复杂的细节就交给计算机吧! 例子二,说有一个n级的台阶,每一步有两种走法,每次跨一步或者跨两步,问从第一阶开始,走到最后一阶有几种不同的走法。 我们知道,每一次向前都有两种走法,一阶或者两阶。问走到最后一阶有多少种走法,走到最后一阶就是说每次一步或者两步的一种组合只要能走到最后一阶,就算一种成功的组合。 每一步两种可能性,有n个台阶。问题是复杂的,但是其中最小的重复单元很明显,就是每次所面临的两种可能性,最后需要满足组合步数等于台阶数就行。 int ans = 0 ; //定义一个全局变量 记录符合要求的组合数 public void

函数递归+匿名函数+内置函数day15

感情迁移 提交于 2020-03-16 06:26:52
一、函数递归 什么是函数递归:   函数递归调用是一种特殊的嵌套调用,在调用一个函数的过程中,又直接或间接地调用了该函数本身。 其中,函数的递归有明确的结束条件,不能无限制的调用,否则会撑破内存,在Python中限定递归最多调用1000层。 1000层这个值是大概的数值,这个数值可以通过Python内置的功能进行更改。 递归必须要有两个明确的阶段:   递推:一层层递归调用下去,强调每次进入下一次递归,问题规模都在减小   回溯:递归必须要有一个明确的结束条件,在满足该条件时结束递推,开始一层层回溯   其中,递归的精髓在于通过不断的重复逼近一个最终结果。 循环(while)能做的,递归都可以,为什么还要递归?   因为相较于循环,递归无须确定循环次数,只需确定结束条件。 举个例子,递归的应用: 二分法: 有个从小到大排列对的列表,判断某个值是否在里面。 nums=[1,3,7,11,22,34,55,78,111,115,137,149,246,312] def search(search_num,nums): print(nums) if len(nums)==0: print('not exists') return mid_index=len(nums)//2 if search_num>nums[mid_index]: nums=nums[mid_index+1:]

python-递归函数

蹲街弑〆低调 提交于 2020-03-15 23:20:32
#recursion_function.py #-*- coding:utf-8 -*- def recursion(x): if x == 1: return 1 return x * recursion(x - 1) f1 = recursion(1) f2 = recursion(2) f3 = recursion(3) f4 = recursion(4) print f1, f2, f3, f4 递归函数的优点是定义简单,逻辑清晰。理论上,所有的递归函数都可以写成循环的方式,但循环的逻辑不如递归清晰。 使用递归函数需要注意防止栈溢出。在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出。 解决递归调用栈溢出的方法是通过 尾递归 优化,事实上尾递归和循环的效果是一样的,所以,把循环看成是一种特殊的尾递归函数也是可以的。 尾递归是指,在函数返回的时候,调用自身本身,并且,return语句不能包含表达式。这样,编译器或者解释器就可以把尾递归做优化,使递归本身无论调用多少次,都只占用一个栈帧,不会出现栈溢出的情况。 上面的 fact(n) 函数由于 return n * fact(n - 1) 引入了乘法表达式,所以就不是尾递归了

递归查找的问题

陌路散爱 提交于 2020-03-15 17:10:39
背景 前几天在开发过程中遇到一个需求,前端需要动态渲染一个菜单,这个菜单是一个树状结构,就是每个菜单中可能有多个子菜单,子菜单中又有子菜单,同时呢,每个菜单都可以单独绑定一个页面。为了加速前端加载页面和渲染速度,后端一次性将整个菜单和页面信息用树形结构返回给前端,结构大概如下(主菜单不算在后端返回的数据中,只是前端的一个入口,黄色虚线框中的数据才是真正需要的): 转化为树结构: 后端将如上数据结构返回给了前端,前端需要将其加载为树型结构。 同时另一个需求是点击某个菜单,如果有页面那么就直接展示其对应的第一个也没,如果没有需要继续找子菜单的第一个页面,都没有那就不显示页面。 按照上图所展示的数据,那么,如果点击 主菜单 ,那么需要战士 页面1-1-1-P1 ,也就是红色展示的部分;如果点击 菜单2 那么需要展示 页面2-P1 ,也就是绿色展示的部分。 实现 需求有了,数据也有了,那么我们考虑实现方式。 首先这个是树,如果加上主目录的话,算是1棵有多个节点的数;如果不算主目录那么算是多棵树。 不管是1棵树,还是多棵树的方式考虑,都是采用 广度优先遍历 的,这里呢我们按照多棵树遍历的方式使用js实现了一下: function getFirstPage(list) { for (const item of list) { if (item.pages && item.pages

个人项目作业

帅比萌擦擦* 提交于 2020-03-14 12:39:39
项目地址: https://github.com/LixinXie/WordCounter 正文 一、WC 项目要求 wc.exe 是一个常见的工具,它能统计文本文件的字符数、单词数和行数。这个项目要求写一个命令行程序,模仿已有wc.exe 的功能,并加以扩充,给出某程序设计语言源文件的字符数、单词数和行数。 实现一个统计程序,它能正确统计程序文件中的字符数、单词数、行数,以及还具备其他扩展功能,并能够快速地处理多个文件。 具体功能要求: 程序处理用户需求的模式为: wc.exe [parameter] [file_name] 基本功能列表: wc.exe -c file.c //返回文件 file.c 的字符数 wc.exe -w file.c //返回文件 file.c 的词的数目 wc.exe -l file.c //返回文件 file.c 的行数 扩展功能: -s 递归处理目录下符合条件的文件。 -a 返回更复杂的数据(代码行 / 空行 / 注释行)。 空行:本行全部是空格或格式控制字符,如果包括代码,则只有不超过一个可显示的字符,例如“{”。 代码行:本行包括多于一个字符的代码。 注释行:本行不是代码行,并且本行包括注释。一个有趣的例子是有些程序员会在单字符后面加注释: } //注释 在这种情况下,这一行属于注释行。 [file_name]: 文件或目录名

vue组件递归

不羁岁月 提交于 2020-03-14 01:45:52
刚才写了篇《 element多层导航菜单 》文章,顺便也写写其中核心原理 其实没啥好说就是组件递归,这里呢简单写个例子, 面试被问到的时候直接拿来手写代码也行, 有看到本文章的同学可以复制代码去试试 没多少代码量,主要是让还没懂组件递归的同学好理解 核心就这个,组件自己调用自己: // ====== 组件: ================== <template> <ul> <li v-for="(item,index) in list " :key="index"> <p>{{item.name}}</p> <treeMenus :list="item.children"></treeMenus> </li> </ul> </template> <script> export default { name: "treeMenus", props: { list: Array } }; </script> <style> ul { padding-left: 20px !important; } </style> // ====== 调用: ================== <!-- html调用 --> <treeMenus :list="treeMenusData"></treeMenus> treeMenusData: [ // 数据格式 { name: "菜单1",

Leetcode 斐波那契数列问题

亡梦爱人 提交于 2020-03-13 21:03:43
题目: 写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项。斐波那契数列的定义如下: F(0) = 0, F(1) = 1 F(N) = F(N - 1) + F(N - 2), 其中 N > 1. 斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。 这道题我们可以用递归或者动态规划来完成。 递归思路——根据给出的斐波那契数列公式,将F(N)视为一个函数,函数求值的过程中不断调用自身。 动态规划——将公式中的F视为一个数组,F(N)即数组中下标为N的值。 递归解法: class Solution { /** * @param Integer $n * @return Integer */ function fib($n) { if($n<2){ return $n; }else{ return $this->fib($n-1)+$this->fib($n-2); } return $dp[$n]; } } 动态规划解法: class Solution { /** * @param Integer $n * @return Integer */ function fib($n) { // if($n<2){ // return $n; // } $dp = ['0'=>0,'1'=>'1']; for($i=2;$i<=$n;$i++

实现一个二叉搜索树(JavaScript 版)

こ雲淡風輕ζ 提交于 2020-03-13 17:21:37
二叉树在计算机科学中应用很广泛,学习它有助于让我们写出高效的插入、删除、搜索节点算法。二叉树的节点定义:一个节点最多只有两个节点,分别为左侧节点、右侧节点。 二叉搜索树是二叉树中的一种,在二叉搜索树中每个父节点的键值要大于左边子节点小于右边子节点。下图展示一颗二叉搜索树。 二叉搜索树实现大纲 本文将使用 JavaScript 语言,实现一个二叉搜索树,以下为实现的方法: constructor():构造函数,初始化一个二叉搜索树 insert(value):二叉树中查找一个节点,如果存在返回 true 否则返回 false preOrderTraverse(cb):先序遍历或称前序遍历 inOrderTraverse(cb):中序遍历 postOrderTraverse(cb):后序遍历 minNodeValue():最小节点值 maxNodeValue():最大节点值 removeNode(value):移除节点 destory():销毁节点 注意 :在实现二叉树搜索 在这里插入代码片 的很多方法中我们将使用大量的递归操作,如果对它不了解的,可以自行查阅资料学习。 初始化一个二叉搜索树 声明一个 BST 类,在构造函数的 constructor() 里声明它的结构: class BST { constructor () { this.root = null; // 初始化根节点

转:经典ACM算法

荒凉一梦 提交于 2020-03-13 07:15:47
实验一 统计数字问题 实验二 最大间隙问题 实验三 众数问题 实验四 半数集问题 实验五 集合划分问题 实验六 最少硬币问题 实验七 编辑距离问题 实验八 程序存储问题 实验九 最优服务次序问题 实验十 汽车加油问题 实验十一 工作分配问题 实验十二 0-1背包问题 实验十三 最小重量机器设计问题 实验十四 最小权顶点覆盖问题 实验十五 集合相等问题 实验十六 战车问题 实验一 统计数字问题 1、问题描述: 一本书的页码从自然数1 开始顺序编码直到自然数n。书的页码按照通常的习惯编排,每个页码都不含多余的前导数字0。例如,第6 页用数字6 表示,而不是06 或006 等。数字计数问题要求对给定书的总页码n,计算出书的全部页码中分别用到多少次数字0,1, 2,…,9。 2、题目分析: 考虑由0,1,2,…,9组成的所有n位数。从n个0到n个9共有个n位数,在这些n位数中,0,1,2,…,9每个数字使用次数相同,设为。 满足如下递归式: 由此可知,。 据此,可从低位向高位进行统计,再减去多余的0的个数即可。 3、算法设计: 定义数组a[10]存放0到9这10个数出现的次数,个位为第0位,第j位的数字为r。采用while循环从低位向高位统计: a. 统计从个位算起前j位0~9个数; b. 如果j+1位为0,去掉第j+1位补0个数; c. 统计第j+1位出现1~(r-1)个数; d.