递归

递归,贪心

我的未来我决定 提交于 2020-03-09 00:25:47
递归 递归算法是指程序直接或间接调用自身的技巧;他通常把一个大型复杂问题层层转化为一个与原问题相似的规模较小的问题来求解。其基本思想为层层分解,关键在于找出递归定义和终止条件。 例题 G:括号匹配问题 字符串(长度不超过100)中有左括号、右括号和大小写字母;规定(与常见的算数式子一样)任何一个左括号都从内到外与在它右边且距离最近的右括号匹配。写一个程序,找到无法匹配的左括号和右括号,输出原来字符串,并在下一行标出不能匹配的括号。不能匹配的左括号用"$“标注,不能匹配的右括号用”?"标注. Input 输入包括多组数据,每组数据一行,包含一个字符串,只包含左右括号和大小写字母,字符串长度不超过100 注意:cin.getline(str,100)最多只能输入99个字符! Output 对每组输出数据,输出两行,第一行包含原始输入字符,第二行由" " , " ? " 和 空 格 组 成 , " ","?"和空格组成," " , " ? " 和 空 格 组 成 , " “和”?"表示与之对应的左括号和右括号不能匹配。 SAMPLE INPUT ((ABCD(x) )(rttyy())sss)( SAMPLE OUTPUT ((ABCD(x) $$ )(rttyy())sss)( ? ?$ 为解决此问题引入STACK函数 # include <iostream> # include

p8 判断二叉树是否相同 (leetcode 100)

匆匆过客 提交于 2020-03-08 16:52:19
一:解题思路 因为树是递归定义的,所以与二叉树的相关操作都可以用递归的方法来解决。用递归的方法来解决,从本质上看也就可以用迭代的方法来解决。这道题目与之前博客的p4(判断二叉树是否对称)几乎是一模一样的。这道题的难度在于,用迭代法求解这个题目,用一个栈来存储树节点。 二:完整代码示例 (C++版和Java版) 递归C++版: class Solution { public: bool isSameTree(TreeNode* p, TreeNode* q) { if (p == NULL && q == NULL) return true; if (p == NULL || q == NULL) return false; return (p->val==q->val) && (isSameTree(p->left,q->left)) && (isSameTree(p->right,q->right)); } }; 递归Java版: class Solution { public boolean isSameTree(TreeNode p, TreeNode q) { if(p==null&&q==null) return true; if(p==null||q==null) return false; return (p.val==q.val)&& (isSameTree(p

递归算法总结

风格不统一 提交于 2020-03-08 14:52:37
递归算法就是把一个大型复杂问题分解为小问题,而递归的关键就是找出递归定义和终止条件。 递归算法的解题步骤: 第一,分析问题,寻找大规模问题与小型问题的联系。 第二,控制递归,找出终止条件。 第三,设计函数,实现有关操作。 例如 1.求1-100的和 递归:f(n)=n+f(n-1); 终止条件:if(n==1)return 1; 函数实现 int f ( int n ) { if ( n == 1 ) return 1 ; return f ( n - 1 ) + n ; } 2.辗转相除法的递归实现 int gcd ( int m , int n ) { if ( n == 0 ) return m ; return gcd ( n , m % n ) } 3.快速幂实现 typedef long long ll ; ll f ( ll int a , int b ) { if ( b % 2 ) return ( a * f ( a , b - 1 ) ) ; ll n = f ( a , b / 2 ) ; //进行优化,减少计算次数 return n * n ; } 4.全排列问题 先把高位排好,再关注少一位的排列情况; 高位有若干种情况,就需要将问题化为多个子问题。每个子问题都与高位的排列有关; 要列举出所有高位的情况,以确定子问题; 需要离散枚举! //产生从元素k

二分查找递归和非递归方法分析

百般思念 提交于 2020-03-08 11:20:26
递归实现: 自己写的递归:多一个赋值操作,虽然可以得到正确的结果。但是比较难以理解。 问题:没有深刻理解递归返回值。return会在递归调用到最后,在递归结束的地方,会将返回值一层一层返回给方法,直到返回最后一层也就是方法不进行递归演算的动作时。 总结:首先要记住递归有递归头和递归体,递归头可能有多重情况。递归体也可能有多重情况。 public static int binarySearch(int[] arr,int n){ int low=0; int high=arr.length-1; return binarySearch2(arr,low,high,n); } public static int binarySearch2(int[] arr,int low,int high,int n){ int z=(low+high)/2; int i=-1; if(low<=high){ if(arr[z]==n ){ return i=z; }else{ if(arr[z]>n){ high=z-1; }else if(arr[z]<n){ low=z+1; } return binarySearch2(arr,low,high,n); } } return i; } 网友的递归: 没有找到对应值,递归结束会走对应的递归头 找到对应值,递归结束走对应递归头 public

怎么求解求1+2+…+n

淺唱寂寞╮ 提交于 2020-03-07 21:22:52
求 1+2+...+n ,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。 没有限制的话可以用等差数列的方式: class Solution { public int sumNums(int n) { return (1 + n) * n / 2; } } 但是题目不能使用乘除法。。该怎么做呢?? 可以使用递归的方式,不能使用 if 语句判断返回,条件与 && 具有短路原则,即在第一个条件语句为 false 的情况下不会去执行第二个条件语句。利用这一特性,将递归的返回条件取非然后作为 && 的第一个条件语句,递归的主体转换为第二个条件语句。 本题的递归返回条件为 n <= 0,取非后就是 n > 0;递归的主体部分为 sum += sumNums(n - 1),转换为条件语句后就是 (sum += sumNums(n - 1)) > 0。 class Solution { public int sumNums(int n) { int result = 0; boolean b = n > 0 && (result = n + sumNums(n-1)) > 0; return result; } } 来源: oschina 链接: https://my.oschina.net/u/3768287/blog

七、抽象

心不动则不痛 提交于 2020-03-07 21:06:24
1、抽象   通过定义处理细节的函数,可以让程序更抽象。   抽象是程序能够被人理解的关键所在。 2、函数定义   使用def(表示定义函数)语句创建函数。   函数执行特定的操作并返回一个值。   内置函数callable,可以判断某个对象是否可调用。   文档字符串:放在函数开头的字符串       3、参数   位置参数:使用位置指定   关键子参数:使用名称指定   有一个星号的参数将放在元组中   有二个星号的参数将放在字典中 4、作用域   局部作用域   全局作用域    5、递归   递归:引用自身   无穷递归   有限递归:(1)基线条件:满足这种条件时函数将直接返回一个值        (2)递归条件:包含一个或多个调用,这些调用旨在解决问题的一部分   经典案例:       (1)阶乘和幂函数              (2)二分查找            6、函数式编程   Python提供了一些函数式编程工具,其中包括lambda表达式以及函数map、filter和reduce。 来源: https://www.cnblogs.com/nuochengze/p/12436694.html

二分查找的递归,非递归,面试题

让人想犯罪 __ 提交于 2020-03-07 19:37:48
一、二分查找 二分查找也叫折半查找,每次查找缩减当前元素量的一半,这种查找效率是很惊人的 时间复杂度 : 假设我们有n个数据,查找一次,元素量变为:2/n;查找k次后的区间: n/2 k,等比数列,当n/2 k = 1时,k就是总的缩小次数,=> O(K) = logn 二、二分查找的递归,非递归,面试题 非递归: /** *二分查找非递归方式 * @param arr 查找的数组 * @param val 要查找的值 * @return */ public static int nBinarySearch(int[]arr,int val){ int low = 0;//第一个元素下标 int hight = arr.length-1;//最后一个元素下标 while (low<=hight){//不加等于号,会不判断low==hight所在元素 int mid = low + (hight-low)/2; //mid = (low + hight)>>1 low,hight之和可能超过int范围 if (arr[mid]>val){//查找元素小于中间值 hight = mid-1; }else if (arr[mid]<val){ low = mid + 1; }else { return mid; } } return -1; } 递归: /** * 二分查找递归方法 *

递归

时光总嘲笑我的痴心妄想 提交于 2020-03-07 19:14:42
1.递归的概念 递归就是方法自己调用自己,每次调用时传入不同的变量 2.递归能解决什么样的问题 1.各种数学问题如:8皇后问题,汉诺塔,阶乘问题,迷宫问题,球和篮子的问题(google编程大赛); 2.各种算法中也会用到递归,比如快排,归并排序,分治算法等; 3.将用栈解决的问题->递归代码比较简洁 3.递归要遵守的重要规则 1.执行一个方法时,就创建一个新的受保护的独立空间(栈空间); 2.方法的局部变量是独立的,不会相互影响; 3.如果方法中使用的是引用类型变量(比如数组),就会引用该引用类型数据; 4.递归必须向退出递归的条件逼近,否则就是无限递归,出现StackOverflowError; 5.当一个方法执行完毕,或者遇到return,就会返回,遵守谁调用就将结果返回给谁,同时当方法执行完毕或者返回时,改方法也就执行完毕. 4.递归小案例 package com . itguigu . recursion ; public class RecursionTest { public static void main ( String [ ] args ) { test ( 4 ) ; int res = factorial ( 4 ) ; System . out . println ( "res=" + res ) ; } // 打印问题 public static

以太坊中RLP编码详解一文全搞懂

人盡茶涼 提交于 2020-03-07 12:44:44
定义 RLP(Recursive Length Prefix,递归长度前缀)是一种编码算法,用于编码任意的嵌套结构的二进制数据,它是以太坊中数据序列化/反序列化的主要方法,区块、交易等数据结构在持久化时会先经过RLP编码后再存储到数据库中。 RLP编码的定义只处理两类数据:一类是字符串(例如字节数组),一类是列表。字符串指的是一串二进制数据,列表是一个嵌套递归的结构,里面可以包含字符串和列表,例如["cat",["puppy","cow"],"horse",[[]],"pig",[""],"sheep"]就是一个复杂的列表。其他类型的数据需要转成以上的两类,转换的规则不是RLP编码定义的,可以根据自己的规则转换,例如struct可以转成列表,int可以转成二进制(属于字符串一类),以太坊中整数都以大端形式存储。 RLP编码规则 对于单个字节,如果它的值范围是[0x00, 0x7f],它的RLP编码就是它本身。 否则,如果一个字符串的长度是0-55字节,它的RLP编码包含一个单字节的前缀,后面跟着字符串本身,这个前缀的值是0x80加上字符串的长度。由于被编码的字符串最大长度是55=0x37,因此单字节前缀的最大值是0x80+0x37=0xb7,即编码的第一个字节的取值范围是[0x80, 0xb7]。 如果字符串的长度大于55个字节,它的RLP编码包含一个单字节的前缀

剑指offer-斐波那契数列

Deadly 提交于 2020-03-07 10:14:29
题目类型 递归 题目描述 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。 n<=39 code class Solution { public : int Fibonacci ( int n ) { if ( n == 0 ) return 0 ; else if ( n == 1 || n == 2 ) return 1 ; else return ( Fibonacci ( n - 1 ) + Fibonacci ( n - 2 ) ) ; } } ; 运行时间:715ms 占用内存:504k 分析 糟心啊 居然把 n==1||n==2 写成 n==1||2 果然是太手生了 来源: CSDN 作者: NCY_92377 链接: https://blog.csdn.net/weixin_36313227/article/details/104708440