递归

php 多维数组简化(递归)

僤鯓⒐⒋嵵緔 提交于 2020-02-03 00:41:04
1 <?php 2 $a=[ 3 4 'a'=>['d'=>['aa'=>1,'bb'=>2,'cc'=>3]], 5 'b'=>['f'=>['dd'=>4,'ee'=>5,'ff'=>6]], 6 'c'=>['g'=>['gg'=>7,'hh'=>8,'ii'=>9]], 7 ]; 8 9 10 $b=reduce_arr($a); 11 echo '<pre>'; 12 var_dump($b); 13 14 15 function reduce_arr ($arr) { 16 17 static $temp = array(); // 声明了一个静态局部变量 18 19 foreach ($arr as $key => $val) { 20 if (is_array($val)) { 21 reduce_arr($val); 22 } else { 23 $temp[$key] = $val; 24 } 25 } 26 return $temp; 27 } 28 ?> 来源: https://www.cnblogs.com/ccs-mxs/p/6889713.html

C语言函数---递归与迭代

老子叫甜甜 提交于 2020-02-03 00:02:39
简单介绍C语言函数 C语言函数是一种函数,用来编译C语言,所在库函数为ctype.h,分为分类函数,数学函数,目录函数,进程函数,诊断函数,操作函数等。 从表面上看,函数在使用时必须带上括号,有必要的话还要传递参数,函数的执行结果也可以赋值给其它变量 对于库函数和自定义函数 C语言在发布时已经为我们封装好了很多函数,它们被分门别类地放到了不同的头文件中(暂时先这样认为),使用函数时引入对应的头文件即可。这些函数都是专家编写的,执行效率极高,并且考虑到了各种边界情况,各位读者请放心使用。 C语言自带的函数称为库函数(Library Function)。库(Library)是编程中的一个基本概念,可以简单地认为它是一系列函数的集合,在磁盘上往往是一个文件夹。C语言自带的库称为标准库(Standard Library),其他公司或个人开发的库称为第三方库(Third-Party Library)。 递归与迭代的区别 递归的基本概念:程序调用自身的编程技巧称为递归,是函数自己调用自己. 一个函数在其定义中直接或间接调用自身的一种方法,它通常把一个大型的复杂的问题转化为一个与原问题相似的规模较小的问题来解决,可以极大的减少代码量.递归的能力在于用有限的语句来定义对象的无限集合. 使用递归要注意的有两点: 1)递归就是在过程或函数里面调用自身; 2)在使用递归时,必须有一个明确的递归结束条件

[LeetCode]617. 合并二叉树(递归)

风格不统一 提交于 2020-02-02 15:13:43
题目 给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。 你需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 NULL 的节点将直接作为新二叉树的节点。 示例 1: 输入: Tree 1 Tree 2 1 2 / \ / \ 3 2 1 3 / \ \ 5 4 7 输出: 合并后的树: 3 / \ 4 5 / \ \ 5 4 7 注意: 合并必须从两个树的根节点开始。 题解 中序遍历的递归方法。 代码 /** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ class Solution { public TreeNode mergeTrees(TreeNode t1, TreeNode t2) { if (t1 == null) return t2; if (t2 == null) return t1; t1.val += t2.val; t1.left = mergeTrees(t1.left, t2.left); t1.right =

洛谷 P1242 新汉诺塔 dfs递归

寵の児 提交于 2020-02-02 08:13:43
洛谷 P1242 新汉诺塔 dfs递归 90分代码: 优先保证编号较大的到达目标位置,把其他编号较小的盘子都先移到中间柱子上。 # include <iostream> # include <algorithm> # include <stdio.h> # include <cmath> # include <queue> # include <cstring> # include <vector> # include <map> # define MAX 50 # define INF 0x3f3f3f3f typedef long long ll ; using namespace std ; //p1记录原始位置,p2记录目标位置 int n , p1 [ MAX ] , p2 [ MAX ] , ans = 0 ; void dfs ( int id , int pos1 , int pos2 ) { if ( pos1 == pos2 ) { //说明不需要转移 return ; } for ( int i = id - 1 ; i >= 1 ; i -- ) { //把所有比id小的圆盘移到中转柱上 dfs ( i , p1 [ i ] , 6 - pos1 - pos2 ) ; } p1 [ id ] = pos2 ; printf ( "move %d from

归纳程序员必须掌握的核心算法(详细)

大城市里の小女人 提交于 2020-02-02 07:22:59
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我, 数据结构与算法应该要学习到哪个程度呢? ,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是 零散 的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过不错的文章给大家。大家也可以留言区补充。 一、算法最最基础 1、时间复杂度 2、空间复杂度 一般最先接触的就是时间复杂度和空间复杂度的学习了,这两个概念以及如何计算,是必须学的,也是必须最先学的,主要有最大复杂度、平均复杂度等,直接通过博客搜索学习即可。 文章推荐: 算法分析神器—时间复杂度 二、基础数据结构 1、线性表 列表(必学) 链表(必学) 跳跃表(知道原理,应用,最后自己实现一遍) 并查集(建议结合刷题学习) 不用说,链表、列表必须,不过重点是链表。 三分钟基础数据结构:如何轻松手写链表? 以后有面试官问你「跳跃表」,你就把这篇文章扔给他 2、栈与队列 栈(必学) 队列(必学) 优先队列、堆(必学) 多级反馈队列(原理与应用) 特别是优先队列,再刷题的时候,还是经常用到的,队列与栈,是最基本的数据结构,必学。可以通过博客来学习。相关文章: 三分钟基础知识:什么是栈?

Python-递归的经典问题-汉诺塔

*爱你&永不变心* 提交于 2020-02-02 04:46:12
代码片 下面展示一些 内联代码片 。 # -*- coding: utf-8 -*- def move(n, a, b, c): if n<1: return elif n==1: return print(a, '-->', c) move((n-1),a,c,b) move(1,a,b,c) move((n-1),b,a,c) move(2,'A','B','C') A - - > C A - - > B C - - > B A - - > C B - - > A B - - > C A - - > C 来源: CSDN 作者: #FFC0CB 链接: https://blog.csdn.net/weixin_44948387/article/details/104130766

第二天。打卡。

江枫思渺然 提交于 2020-02-02 03:57:14
1. 2041 1.1 并不知道为什么是斐波拉契数列【到底是怎么知道是这个数列的?】 1.2 用递归倒是可以理解,但并想不到。 1.3 非常惊讶的地方在于,居然可以先把数列全部存在数组里然后读取,special! 2. 2043 其实挺水的,一直没检查出来哪里有错……最后发现是输出大小写的问题【呵。 要细心一点看题要求。 3. 2044 算了几个数据发现可以用斐波拉契数列做,但是一直WA,后来发现是数字的问题,因为数据太大,用的类型要是long long。 来源: https://www.cnblogs.com/moonlightshadow/p/6560467.html

H - Pots

白昼怎懂夜的黑 提交于 2020-02-02 01:57:02
给你两个容器,分别能装下A升水和B升水,并且可以进行以下操作 FILL(i) 将第i个容器从水龙头里装满(1 ≤ i ≤ 2); DROP(i) 将第i个容器抽干 POUR(i,j) 将第i个容器里的水倒入第j个容器(这次操作结束后产生两种结果,一是第j个容器倒满并且第i个容器依旧有剩余,二是第i个容器里的水全部倒入j中,第i个容器为空) 现在要求你写一个程序,来找出能使其中任何一个容器里的水恰好有C升,找出最少操作数并给出操作过程 Input 有且只有一行,包含3个数A,B,C(1<=A,B<=100,C<=max(A,B)) Output 第一行包含一个数表示最小操作数K 随后K行每行给出一次具体操作,如果有多种答案符合最小操作数,输出他们中的任意一种操作过程,如果你不能使两个容器中的任意一个满足恰好C升的话,输出“impossible” Sample Input 3 5 4 Sample Output 6 FILL(2) POUR(2,1) DROP(1) POUR(2,1) FILL(2) POUR(2,1) 这是一道非常恶心的BFS的题,不但要找出最短路径(到达c的最短路),还要记录路径过程,这里用的结构的特性定义了数组pre[][],用pre[x][y]中的x,y来表示两个容器分别到达x,y两种状态,用pre[x][y].x和pre[x][y].y和pre[x][y]

问题 G: 【递归】数字三角形-------------------递归(记忆化搜索)

时光毁灭记忆、已成空白 提交于 2020-02-02 00:23:48
题目描述 对于大多数人来说,“我们是这么的正常,因此也就这么的平庸。”而天才总是与众不同的,所以当邪狼问修罗王:“老大,你蹲在那儿一动不动看了有半个小时了,蚂蚁有那么好看吗?” 修罗王是这样回答的:“我在思索人生的意义,你看这蚂蚁的面前有无数的道路选择,但它不知道选择哪条路可以到达目标,也不知道哪条路上有更多的食物,更不知道现在选择的道路对它以后的影响……” 如图所示,有一个层数为n(n≤1000)的数字三角形。现有一只蚂蚁从顶层开始向下走,每走下一级时,可向左下方向或右下方向走。求走到底层后它所经过数字的总和的最大值。 输入 第一个整数为n,以下n行为各层的数字。 输出 一个整数,即最大值,保证不超过整型的最大范围。 样例输入 Copy 5 1 6 3 8 2 6 2 1 6 5 3 2 4 7 6 样例输出 Copy 23 提示 最大值=1+3+6+6+7=23 #include < bits / stdc ++ . h > using namespace std ; const int N = 1005 ; int a [ N ] [ N ] ; int vis [ N ] [ N ] ; int n ; int dfs ( int x , int y ) { //如果被标记过或者到最后一行了,返回该值 if ( vis [ x ] [ y ] || x == n )

【Python数据结构与算法笔记day29】6.4. 快速排序

混江龙づ霸主 提交于 2020-02-01 22:47:07
文章目录 6.4. 快速排序 快速排序 快速排序的分析 时间复杂度 快速排序演示 6.4. 快速排序 快速排序 快速排序(英语:Quicksort),又称划分交换排序(partition-exchange sort),通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。 步骤为: 从数列中挑出一个元素,称为"基准"(pivot), 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区结束之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。 递归的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了。虽然一直递归下去,但是这个算法总会结束,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去。 快速排序的分析 def quick_sort ( alist , start , end ) : """快速排序""" # 递归的退出条件 if start >= end : return # 设定起始元素为要寻找位置的基准元素 mid =