递归

由递归排序引申出的小和问题和逆序数对问题

送分小仙女□ 提交于 2020-01-31 13:02:09
递归排序的思想是将带牌列数组不断的拆成俩部分,再将有序的左右的俩部分合并。 小和问题:在一个数组中,每一个数左边比当前小的数累加起来,叫做这个数组的小和。求一个数组的小和。 逆序对问题,在一个数组中,打印出数组所有左边数大于右边数的组合。 下面是归并排序的代码(go语言) // 写一个归并排序 func mergeSort(arr *[]int, l, r int) { // 这部分是拆 if l == r { return } mid := l + ((r - l) >> 1) mergeSort(arr, l, mid) mergeSort(arr, mid+1, r) merge(arr, l, mid, r) } func merge(arr *[]int, l, mid, r int) { p, q := l, mid+1 help := make([]int, r-l+1) i := 0 for p <= mid && q <= r { if (*arr)[p] <= (*arr)[q] { help[i] = (*arr)[p] p = p + 1 i = i + 1 } else { help[i] = (*arr)[q] q = q + 1 i = i + 1 } } for p <= mid { help[i] = (*arr)[p] p = p + 1 i =

想了解递归神经网络?这里有一份入门教程

久未见 提交于 2020-01-31 11:04:32
导语:递归网络是一类人工神经网络,用于识别诸如文本、基因组、手写字迹、语音等序列数据的模式,或用于识别传感器、股票市场、政府机构产生的数值型时间序列数据。 递归神经网络入门教程 引言 递归神经网络是一类人工神经网络,可用于识别诸如文本、基因组、手写字迹、语音等序列数据的模式,也可用于识别传感器、股票市场、政府机构产生的数值型时间序列数据。递归网络可以说是最强大的神经网络,甚至可以将图像分解为一系列图像块,作为序列加以处理。由于递归网络拥有一种特定的记忆模式,而记忆也是人类的基本能力之一,所以下文会时常将递归网络与人脑的记忆活动进行类比。 前馈网络回顾 要理解递归网络,首先需要了解前馈网络的基础知识。这两种网络的名字都来自于它们通过一系列网络节点数学运算来传递信息的方式。前馈网络将信息径直向前递送(从不返回已经过的节点),而递归网络则将信息循环传递。 在前馈网络中,样例输入网络后被转换为一项输出;在进行有监督学习时,输出为一个标签。也就是说,前馈网络将原始数据映射到类别,识别出信号的模式,例如一张输入图像应当给予“猫”还是“大象”的标签。 我们用带有标签的图像定型一个前馈网络,直到网络在猜测图像类别时的错误达到最少。将参数,即权重定型后,网络就可以对从未见过的数据进行分类。已定型的前馈网络可以接受任何随机的图片组合,而输入的第一张照片并不会影响网络对第二张照片的分类

Linux的文件与目录的基本操作

点点圈 提交于 2020-01-31 10:35:07
文件与目录的基本操作 1.ls 列出文件或者目录的信息,目录的信息就是其中包含的文件。 # ls [-aAdfFhilnrRSt] file|dir -a :列出全部的文件 -d :仅列出目录本身 -l :以长数据串行列出,包含文件的属性与权限等等数据 2.cd 更换当前目录。 cd [相对路径或绝对路径] 3.mkdir 创建目录。 # mkdir [-mp] 目录名称 -m :配置目录权限 -p :递归创建目录 4.rmdir 删除目录,目录必须为空。 rmdir [-p] 目录名称 -p :递归删除目录 5.touch 更新文件时间或者建立新文件。 # touch [-acdmt] filename -a : 更新 atime -c : 更新 ctime,若该文件不存在则不建立新文件 -m : 更新 mtime -d : 后面可以接更新日期而不使用当前日期,也可以使用 --date="日期或时间" -t : 后面可以接更新时间而不使用当前时间,格式为[YYYYMMDDhhmm] 6.cp 复制文件。如果源文件有两个以上,则目的文件一定要是目录才行。 cp [-adfilprsu] source destination -a :相当于 -dr --preserve=all -d :若来源文件为链接文件,则复制链接文件属性而非文件本身 -i :若目标文件已经存在时

递归算法

末鹿安然 提交于 2020-01-31 10:20:39
核心思想: 重复将问题分解为同类的子问题而解决问题的方法,其核心思想是分治策略。 使用条件: 1.需要解决的问题可以转化为一个或多个子问题来求解,而这些子问题的求解方法与原问题完全相同,只是在数量和规模上不同。 2.递归调用的次数必须是有限的。 3.必须有结束递归的条件来终止递归。 举例( LeetCode 894 ): 满二叉树是一类二叉树,其中每个结点恰好有 0 或 2 个子结点。 返回包含 N 个结点的所有可能满二叉树的列表。 答案的每个元素都是一个可能树的根结点。 答案中每个树的每个结点都必须有 node.val=0。 你可以按任何顺序返回树的最终列表。 思路 : 构造二叉树的思路是对于二叉树的每一层来说,我们都是先初始化一个根节点, 然后分别定义它的左子树和右子树,这个过程很明显可以递归实现。 本题要求构造满二叉树,也就是每一个结点它的左节点和右节点必须同时存在 或同时不存在,假设左子树有X个节点,总节点数为N,右子树则包含N - 1 - X个 节点,X数目从 1 开始,增加到N - 1 - 1 ,共计(N - 1 ) / 2 中情况 对于每一种子情况我们采取递归求解 : 结束条件 : 当N为偶数时,无法构造二叉树,返回空数组。 当N为 1 时,树只有一个节点,为了不破坏递归,同样返回一个数组,包含这个节 点 左右子树构造采用递归的方法。 # Definition for

数据结构 递归遍历二叉树 C/C++

断了今生、忘了曾经 提交于 2020-01-31 06:38:47
#include<stdio.h> #include<stdlib.h> typedef struct btnode { char data; struct btnode *lchild,*rchild; }btnode,*bitree; bitree Creatbintree() //前序遍历创建二叉树 { char ch; bitree bt; scanf("%c",&ch); if(ch=='#') bt=NULL; else { bt=(btnode*)malloc(sizeof(btnode)); bt->data=ch; bt->lchild=Creatbintree(); bt->rchild=Creatbintree(); } return bt; } void Preorder(bitree bt) //前序遍历 { if(bt==NULL) return; printf("%c ",bt->data); Preorder(bt->lchild); Preorder(bt->rchild); } void Inorder(bitree bt) //中序遍历 { if(bt==NULL) return; Preorder(bt->lchild); printf("%c ",bt->data); Preorder(bt->rchild); } void

lectcode-二叉树的最近公共祖先

≡放荡痞女 提交于 2020-01-31 05:11:00
要求 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。” 代码 递归 TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) { if(!root||root==p||root==q) return root; TreeNode *first = lowestCommonAncestor(root->left,p,q); TreeNode *second = lowestCommonAncestor(root->right,p,q); if(first&&second) return root; //如果first和second都找到了,就可以返回根节点。 return first?first:second; //如果first找到了就赋给second。 } 总结 递归时先从当前头节点递归,找到两个节点位置,保存到first和second.如果first和second都不为空,则返回根节点。 来源: CSDN 作者: 易殇 链接: https://blog.csdn.net/Dreamer_rx

数据结构 非递归遍历二叉树

一世执手 提交于 2020-01-31 04:59:35
#include<stdio.h> #include<stdlib.h> #define MAX 100 typedef struct { bitree ptr; int flag; }stacknode; typedef struct { stacknode elm[MAX]; int top; }sqstack; typedef struct btnode { char data; struct btnode *lchild,*rchild; }btnode,*bitree; bitree Creatbintree() //前序遍历创建二叉树 { char ch; bitree bt; scanf("%c",&ch); if(ch=='#') bt=NULL; else { bt=(btnode*)malloc(sizeof(btnode)); bt->data=ch; bt->lchild=Creatbintree(); bt->rchild=Creatbintree(); } return bt; } typedef struct { bitree data[MAX]; int top; }seqstack; seqstack *Init_seqstack() { seqstack *s; s=malloc(sizeof(seqstack)); if(s) s->top=

21-合并两个有序链表

╄→尐↘猪︶ㄣ 提交于 2020-01-31 04:26:18
还是没有用顺手递归,这道题第一次我是新创建了一个链表,然后依次把小的加入新链表,虽然也过了,但是毫无意义,因为这道题真正想要你用递归来做,可我想了三个小时才想出递归该怎么弄,代码就几行,还是很有挫败感的。。。 先比较当前两个链表的第一个位置的大小,如果第一个链表小,那么就把第一个元素作为新链表的元素,然后把第一个链表的下一个位置和另一个链表再调用mergeTwoLists方法,边界值就是当其中一个链表为空时返回另一个链表。就这样,我居然用了三个小时,递归好难。。。接下来专门去做几道递归题把 代码如下: 来源: CSDN 作者: qq_40058686 链接: https://blog.csdn.net/qq_40058686/article/details/104117744

数据结构入门(三)栈的应用

别来无恙 提交于 2020-01-31 03:40:02
  在之前的两篇文章—— 数据结构入门(一)栈的实现 和 数据结构入门(二)栈的应用之数学表达式求值 中,笔者分别介绍了“栈”这个数据结构在数的进制转换和数学表达式求值方面的应用。在本文中,笔者将会再介绍栈的四个应用,它们分别是: 判断字符串是否回文 括号匹配 行编辑程序 二叉树的深度优先遍历   栈的结构实现可以参考 数据结构入门(二)栈的应用之数学表达式求值 ,本文将不再具体给出。 判断字符串是否回文   所谓回文字符串就是指正读反读均相同的字符序列,如“12321”、“aha”、“ahaha”、“清水池里池水清”均是回文,但“ahah”不是回文。通过栈这个数据结构我们将很容易判断一个字符串是否为回文。   首先我们需要找到该字符串的中心点。对于长度为奇数的字符串,中心点就是中间的那个元素;对于长度为偶数的字符串,中心点恰好位于长度为一半的那个元素及其后一个元素的中间。接着将中心点前面的字符依次入栈,然后将当前栈中的字符依次出栈,看看是否能与 中心点之后的字符一一匹配,如果都能匹配则说明这个字符串是回文字符串,否则就不是回文字符串。   以下是利用栈来实现判断字符串是否回文的Python代码: # -*- coding: utf-8 -*- # using Stack to check if a string is plalindrome from Stack import

[LeetCode] 98. Validate Binary Search Tree

强颜欢笑 提交于 2020-01-31 03:21:17
验证二叉搜索树。题目即是题意。二叉搜索树的特性是对于每个node而言,他的左子树上任意节点都比他自身小,右子树上任意节点都比他自身大。这个题也是有两种做法,迭代和递归。 时间空间复杂度都是O(n)。 例子, Example 1: 2 / \ 1 3 Input: [2,1,3] Output: true Example 2: 5 / \ 1 4 / \ 3 6 Input: [5,1,4,null,null,3,6] Output: false Explanation: The root node's value is 5 but its right child's value is 4. 迭代 迭代的做法会利用到inorder的做法,也是用到一个栈。按照inorder的顺序遍历所有的node,记录一个 pre node 和一个 currrent node 。因为是inorder的关系,如果这个BST是有效的, inorder的遍历结果会是有序的 。 1 /** 2 * @param {TreeNode} root 3 * @return {boolean} 4 */ 5 var isValidBST = function (root) { 6 if (root === null) return true; 7 let stack = []; 8 let cur = root; 9