递归调用

个人项目-WC

谁说胖子不能爱 提交于 2019-11-30 12:44:12
1、GitHub地址: https://github.com/huanf921/WC 2、PSP表格 PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟) Planning 计划 30 35 · Estimate · 估计这个任务需要多少时间 30 35 Development 开发 1530 1475 · Analysis · 需求分析 120 100 · Design Spec · 生成设计文档 30 30 · Design Review · 设计复审 40 60 · Coding Standard · 代码规范 20 40 · Design · 具体设计 60 80 · Coding · 具体编码 1200 1000 · Code Review · 代码复审 30 40 · Test · 测试(自我测试,修改代码,提交修改) 30 35 Reporting 报告 80 90 · Test Report · 测试报告 30 50 · Size Measurement · 计算工作量 20 20 · Postmortem & Process Improvement Plan · 事后总结, 并提出过程改进计划 30 20 合计 1640 1600 3、解题思路   在做这次项目的时候,我首先在理解分析项目需求的时候

用递归来判断输入的字符串是否是回文

早过忘川 提交于 2019-11-30 12:29:37
设计思路:导入Scanner类输入字符串,再将输入的字符串转化为字符数组,然后从字符串左右两侧依次比较字符chu是否相同,若相同递归返回读取的字符个数,若返回字符的个数==输入字符串的长度,则输出该字符串是回文,否则输 出该字符串不是回文 import java.util.Scanner; public class test1 { public static void main(String[] args) { // TODO Auto-generated method stub Scanner input = new Scanner(System.in); String a = input.nextLine(); char[] temp = a.toCharArray(); int c = fun(0, temp.length-1, temp); if (c == temp.length) System.out.println("该字符串是回文数"); else System.out.println("该字符串不是回文数"); input.close(); } public static int fun(int i, int j, char[] a) { //定义一个函数判断字符串是否是回文 if (j == i) //字符串长度为奇数 return 1; else if(i -

回文判断

馋奶兔 提交于 2019-11-30 12:25:36
程序源代码: package math; public class Eo { public static void jun(String s, int n, int m) { if (n==0||n==1||m==n)// 判断递归结束条件, n 等于零或为一(字符串只有一个或空 的一定是回文), n 与 m 相等(从开头的字符一一对应着 从末尾的字符) { System. out .println(" 回文 " ); } else { if (s.charAt(m)!=s.charAt(n))// 如果两端的字符不相等结束递归输出不是 回文 { System. out .println(" 不是回文 " ); } else if (s.charAt(m)==s.charAt(n))// 如果两端的字符相等继续递归 { jun (s,n-1,m+1); // 问题规模减小 } } } public static void main( String args[] ) { String s="woyihokhiyow"; int n=s.length(); int m=0; jun (s,n-1,m); } } 运行截图: 主要思路: 解析题目要求 -- 判断是否是回文 1、 给出的提示是只有一个或零个字符的字符串一定是回文,故这可以作为递归结束的终止条件 2、

二叉树的遍历算法

大城市里の小女人 提交于 2019-11-30 12:05:43
遍历(Traverse) 就是按照某种次序访问树中的所有结点,且每个结点恰好访问一次 也就是说,按照被访问的次序,可以得到由树中所有结点排成的一个序列 树的遍历也可以看成是人为的将非线性结构线性化 这里的“访问”是广义的,可以是对结点作各种处理,例如输出结点信息、更新结点信息等 在我们的现实中,并不真正的“访问”这些结点,而是得到一个结点的线性序列,以线性表的形式输出 将整个二叉树看做三部分:根、左子树、右子树。如果规定先遍历左子树、在遍历右子树,那么根据根的遍历顺序就有三种遍历方式: 左子树 右子树 根 先序/根遍历DLR:根 左子树 右子树 中序/根遍历LDR:左子树 根 右子树 后序/根遍历LRD:左子树 右子树 根 注意:由于树的递归定义,其实对三种遍历的概念其实也是一个递归的描述过程 先序/根遍历DLR:1 4 5 2 3 6 7 中序/根遍历LDR:4 5 1 3 2 6 7 后序/根遍历LRD:5 4 3 7 6 2 1 如果按层次遍历,没有递归 面试题:已知一棵二叉树的后序遍历的序列为5 4 3 7 6 2 1,中序遍历的序列为4 5 1 3 2 6 7,则其先序遍历的序列是什么? 只要给定中序遍历,先序遍历或者后序遍历再给一个,就可以求出另一个 后序遍历最后肯定是根,所以确定1是根 所以4 5是左子树,3 2 6 7是右子树 依此类推 /** *二叉链表的结点 *

编译原理:文法和语言总结与梳理

為{幸葍}努か 提交于 2019-11-30 12:03:56
1. 梳理第二章的内容,写一篇理解与总结。 一、 对程序设计语言的描述从语法、语义和语用三个因素考虑: 语法:对语言结构的定义; 语义:语言的含义; 语用:从使用的角度描述语言。 形式语言理论是编译的理论基础。 二、 字母表:元素的非空有穷集合; 符号/字符:字母表中的元素; 符号串:符号的有穷序列。 三、 符号串运算: 符号串的连接:εx=xε=x; 集合的乘积:AB={xy|x∈A,y∈B};{ε}A=A{ε}=A; 符号串的幂运算:x=abc,x^2=abcabc; 集合的幂运算 正闭包A+与闭包A*:A*={ε}∪A+ 四、 形式语言:字母表上按照某种规则构成的所有符号串的集合,其不考虑语义。描述形式语言的方式有两种: 枚举——当语言为有穷集合时; 文法——描述了无穷集合的语言。 五、 文法:G=(Vn,Vt,P,S) 规则P:也称为产生式,是一个符号与一个符号串的有序对(A,β)   A→β   i. 一组规则定义了一个语言的语法结构;   ii. 规则中出现的符号分为终结符号和非终结符号 b) Vn为非终结符(non-terminate); c) Vt为终结符(terminate); d) S为非终结符号,称为文法的开始符号/识别符号,至少要在一条规则的左部出现。 六、 推导:推导的依据是规则 a) 直接推导:仅使用一次规则; b) 推导:至少使用一次规则; c)

迭代器,生成器和递归

邮差的信 提交于 2019-11-30 11:29:07
迭代器和生成器 可迭代对象 具有 __iter__ 方法的对象,就是可迭代对象。 可迭代对象返回的值是一个具有 __next__ 方法的对象叫迭代器对象 In [2]: a = [1,2] In [3]: it = a.__iter__() In [4]: it Out[4]: <list_iterator at 0x1e69be013c8> In [5]: it.__next__() Out[5]: 1 可迭代对象有:str, list, tuple, dict, set, file 迭代器对象返回的还是迭代器对象,具有`__next__`方法 In [5]: it.__next__() Out[5]: 1 In [6]: it Out[6]: <list_iterator at 0x1e69be013c8> In [7]: for i in it: ...: print(i) ...: 2 In [8]: it2 = it.__iter__() In [9]: it2 Out[9]: <list_iterator at 0x1e69be013c8> 三元表达式 In [11]: print(1) if 1<2 else print(2) 1 列表推导式 In [15]: b = (i for i in range(8)) In [16]: b Out[16]:

递归函数

不想你离开。 提交于 2019-11-30 10:47:35
程序函数递归原理讲解 一、在说函数递归的时候,顺便说一下栈的概念。 栈是一个后进先出的压入(push)和弹出(pop)式数据结构。在程序运行时,系统每次向栈中压入一个对象,然后栈指针向下移动一个位置。当系统从栈中弹出一个对象时,最近进栈的对象将被弹出。然后栈指针向上移动一个位置。程序员经常利用栈这种数据结构来处理那些最适合用后进先出逻辑来描述的编程问题。这里讨论的程序中的栈在每个程序中都是存在的,它不需要程序员编写代码去维护,而是由运行是系统自动处理。所谓的系统自动维护,实际上就是编译器所产生的程序代码。尽管在源代码中看不到它们,但程序员应该对此有所了解。 再来看看程序中的栈是如何工作的。当一个函数(调用者)调用另一个函数(被调用者)时,运行时系统将把调用者的所有实参和返回地址压入到栈中,栈指针将移到合适的位置来容纳这些数据。最后进栈的是调用者的返回地址。当被调用者开始执行时,系统把被调用者的自变量压入到栈中,并把栈指针再向下移,以保证有足够的空间存储被调用者声明的所有自变量。当调用者把实参压入栈后,被调用者就在栈中以自变量的形式建立了形参。被调用者内部的其他自变量也是存放在栈中的。由于这些进栈操作,栈指针已经移动所有这些局部变量之下。但是被调用者记录了它刚开始执行时的初始栈指针,以他为参考,用正或负的偏移值来访问栈中的变量。当被调用者准备返回时,系统弹出栈中所有的自变量

从迭代器到递归

…衆ロ難τιáo~ 提交于 2019-11-30 10:28:41
迭代器 迭代器并不是函数,只是一个称呼而已 python中一切皆对象(数据类型) 可迭代对象:含有 __iter__ 方法的数据类型就叫做可迭代对象 python中除了数字类型,多有数据类型都是可迭代对象 迭代器对象 迭代器对象就是含有 __iter__ 和 __next__ 方法的对象 为什么要有迭代器对象:提供了不依赖索引取值的手段 for循环原理(for循环本质就是一个while循环,只不过是一个一定可控的while循环) 可迭代对象 可迭代对象:含有 __iter__ 方法叫做可迭代对象--》除了数字类型都是可迭代对象--》可迭代对象使用 __iter__ 变成迭代器 迭代器对象 迭代器对象:含有 __iter__ 和 __next__ 方法叫做迭代器对象--》只有文件时迭代器对象--》迭代器使用 __iter__ 依然是迭代器 可迭代对象不一定是迭代器对象;迭代器对象一定是可迭代对象。 三元表达式 顾名思义就是只能赚三块钱的表达式 这只是程序员装逼用的代码,实际上不大会使用 x=10 y=20 print(x) if x>y else print(y) 如果条件成立则走这里,if条件else条件不成立走这里 列表推导式 lt=[i**2 for i in range(10)] # ↑这里是可以变的 print(lt) 字典生成式 lt1 = ['a', 'b', 'c']

用递归调用来判断字符串是否是回文

杀马特。学长 韩版系。学妹 提交于 2019-11-30 09:59:26
思路:先判断字符串的长度,当为1时就是回文的字符串,之后如果大于1,就调用函数进行判断。通过返回值对其是否是回文进行输出。 在函数中主要是传入字符串数组还有两个参数,经两个参数作为下标,通过字符串的CharAt函数对字符串的相应部分进行比较,最后进行两个参数,前面的加一后面的减1,逐渐向中间靠拢。依次进行比较、当只剩下一个或者两个时对其进行另外的分析。 其主要的代码如下: package chengZhang; import java.util.Scanner; public class JieCheng { public static int diaoyong(String c,int a,int b) { if(a==b)//当时奇数时候 return 1; if(a+1==b)//当是偶数时候并且只有两个了 { if(c.charAt(a)==c.charAt(b))//进行两边 的比较 return 1; else return -1; } else { if(c.charAt(a)==c.charAt(b)) { a+=1; b-=1; return diaoyong(c,a,b);//递归调用 } else return -1; } } public static void main(String[] args) { Scanner sc=new Scanner

验证码和判断回文(递归)

送分小仙女□ 提交于 2019-11-30 08:21:42
一:产生6位的随机验证码(区分大小写) 思路:1.将62位字符存在字符串中,先产生随机的6位数 2.用append()定义动态字符串数组,再用charAt()对其进行索引,从而形成随机字符的函数 3.书写主函数,调用getStringRandom(n)函数,决定产生随机字符的位数 package identifying_code; import java.util.Scanner; import java.util.Random; public class Identifying_Code { public static String getStringRandom(int length) {//length表示随机生成几位随机数 String str="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; Random random=new Random(); StringBuffer bf=new StringBuffer();//动态字符串数组 for(int i=0;i<length;i++) { int number=random.nextInt(62);//随机产生0-62的数字 bf.append(str.charAt(number));//往动态字符串数组添加 //str.charAt