递归

递归

你离开我真会死。 提交于 2020-02-21 17:29:50
一、什么是递归? 递归,就是在运行的过程中调用自己。 递归,需要写出口。    //斐波那契数列指的是这样一个数列:1、1、2、3、5、8、13、21、…… //这个数列从第三项开始,每一项都等于前两项之和。 public static int get(int num) { if (num==1) { return 1; } if (num==2) { return 1; } return get(num-1)+get(num-2); } 来源: https://www.cnblogs.com/l1314/p/12342044.html

剑指Offer24-反转链表

你离开我真会死。 提交于 2020-02-21 11:42:19
剑指Offer典型题整理 - 争取做最好的题解 剑指Offer24-反转链表 整理时间:2020年02月17日 本题和 LeetCode-206 相同 题目描述 定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点,使用递归和迭代两种方式实现。 示例 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL 限制: 0 <= 节点个数 <= 5000 题解 这是一道非常经典的题目了,递归和迭代两种实现实现方法更是能够体现基本编程素养。 😊解法1:双指针迭代法 需要使用到两个指针,指针 cur 定位原先链表的头,指针 pre 定位逆转链表的头。解决这种问题最好的方法还是画图自己分析,流程图如下: C++版本 /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: ListNode* reverseList(ListNode* head) { ListNode *pre = NULL; ListNode *cur = head; while (cur !=

Java数据结构与算法->递归

感情迁移 提交于 2020-02-21 11:25:26
递归 递归设计思路 1.找重复 (子问题) 2.找重复中的变化量 -> 参数 3.找参数变化趋势 -> 设计出口 换句话说就是把一个任务划一刀分成两份,自己做一部分,委托别人做另外一部分。 练习策略 1.循环改递归 2.经典递归 3.大量练习,总结规律,掌握套路 递归的定义 1.自身调用自身 public class Main { public static void main ( String [ ] args ) { function ( 10 ) ; } static void function ( int i ) { if ( i == 0 ) { //退出递归的条件 return ; } function ( i - 1 ) ; //自身调用自身 } } 练习 求n*(n-1)的阶乘 public class Main { public static void main ( String [ ] args ) { f1 ( 10 ) ; } /* * f1(n):求n的阶乘 --> 求n-1的阶乘 * 找重复:n*(n-1)的阶乘,求(n-1)是问题的重复 * 找变化:变化的量应该作为参数 * 找边界:出口 */ static int f1 ( int n ) { if ( n == 1 ) { return 1 ; //因为1的阶乘就是1 } return n * f1

基础知识概要

家住魔仙堡 提交于 2020-02-20 19:29:21
1.算法复杂度——O记号,Ω符号,θ符号 T(n)=O(f(n)) iff c>0,当 n足够大时,有T(n)<c*f(n)T(n)=Ω(f(n)) iff c>0,当 n足够大时,有T(n)>c*f(n)T(n)=θ(f(n)) iff c1c2>0,当 n足够大时,有c1*f(n)>T(n)>c2*f(n) 2.复杂度类型 1)常数复杂度——O(1):效率最高 2)对数复杂度——O(logn):lnN,lgN,log,这类算法非常有效,复杂度无限接近于常数,logN=O(N^c) 3)多项式复杂度——O(n^c): 4)线性复杂度——O(n):所有O(n)类函数 5)指数复杂度——O(a^n):这类算法计算成本增长极快,通常被认为不可忍受 3.复杂度分析的主要方法: 迭代:级数求和 递归:递归跟踪+递推方程 猜测+验证 4.封底估算 1天=24hr*60min*60sec=25*4000=10^5sec 一生=一世纪=100yr*365=3*10^4day=3*10^9sec 三生三世=10^10sec 5.迭代和递归 计算任意n个整数之和 迭代:int sum=0;//O(1)for(int i=0;i<n;i++)//O(n) sum+=A[i];O(1) return sum;O(1)递归:return (n<1)?0:sum(A,n-1) +A[n-1]

分形(递归&&坐标变换)

笑着哭i 提交于 2020-02-20 02:16:44
分形,具有以非整数维形式充填空间的形态特征。 通常被定义为“一个粗糙或零碎的几何形状,可以分成数个部分,且每一部分都(至少近似地)是整体缩小后的形状”,即具有自相似的性质。 现在,定义“盒子分形”如下: 一级盒子分形: X 二级盒子分形: X X X X X 如果用B(n - 1)代表第n-1级盒子分形,那么第n级盒子分形即为: B(n - 1) B(n - 1) B(n - 1) B(n - 1) B(n - 1) 你的任务是绘制一个n级的盒子分形。 输入格式 输入包含几个测试用例。 输入的每一行包含一个不大于7的正整数n,代表要输出的盒子分形的等级。 输入的最后一行为-1,代表输入结束。 输出格式 对于每个测试用例,使用“X”符号输出对应等级的盒子分形。 请注意’X’是一个大写字母。 每个测试用例后输出一个独立一行的短划线。 输入样例: 1 2 3 4 -1 输出样例 X - X X X X X - X X X X X X X X X X X X X X X X X X X X X X X X X - X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X

java动手动脑3

霸气de小男生 提交于 2020-02-20 02:15:39
2016-10-152016-10-15一.编写一个方法,使用以上算法生成指定数目(比如1000个)的随机整数。 生成50个1到10的随机整数。 value=a+(int)(Math.Random()*b) 生成a到b的随机整数 JOptionPane.showMeaasgeDialog(null;output,".....") 弹出框题目 二.代码MethodOverLoad有什么特殊之处? 使用了同一种方法但是是不同类型。这是“方法重载”,构成重载的条件:1.方法名相同(square)2.参数类型不同(int,double),参数个数不同或参数类型的顺序不同。 三. (1)使用组合数公式利用n!计算。 (2)使用递推的方法用杨辉三角形计算 (3)使用递归的方法用组合数递推公式计算 四.递归编程解决汉诺塔问题。 五.使用递归方式判断某个字符是否是回文。(panlindrom) 来源: https://www.cnblogs.com/cxr0711/p/5964921.html

Java实现 LeetCode 110 平衡二叉树

穿精又带淫゛_ 提交于 2020-02-19 10:53:14
110. 平衡二叉树 给定一个二叉树,判断它是否是高度平衡的二叉树。 本题中,一棵高度平衡二叉树定义为: 一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。 示例 1: 给定二叉树 [3,9,20,null,null,15,7] 3 / \ 9 20 / \ 15 7 返回 true 。 示例 2: 给定二叉树 [1,2,2,3,3,null,null,4,4] 1 / \ 2 2 / \ 3 3 / \ 4 4 返回 false 。 PS: 模版一共三步,就是递归的三部曲: 找终止条件:什么时候递归到头了?此题自然是root为空的时候,空树当然是平衡的。 思考返回值,每一级递归应该向上返回什么信息?参考我代码中的注释。 单步操作应该怎么写?因为递归就是大量的调用自身的重复操作,因此从宏观上考虑,只用想想单步怎么写就行了,左树和右树应该看成一个整体,即此时树一共三个节点:root,root.left,root.right。 class Solution { //这个ReturnNode是参考我描述的递归套路的第二步:思考返回值是什么 //一棵树是BST等价于它的左、右俩子树都是BST且俩子树高度差不超过1 //因此我认为返回值应该包含当前树是否是BST和当前树的高度这两个信息 private class ReturnNode{ boolean isB; int depth

PHP递归创建多级目录(一道面试题的解题过程)

无人久伴 提交于 2020-02-19 08:55:20
今天看到一道面试题,要写出一个可以创建多级目录的函数: 我的第一个感觉就是用递归创建,具体思路如下: function Directory($dir){     if(is_dir($dir) || @mkdir($dir,0777)){ //查看目录是否已经存在或尝试创建,加一个@抑制符号是因为第一次创建失败,会报一个“父目录不存在”的警告。         echo $dir."创建成功<br>"; //输出创建成功的目录     }else{         $dirArr=explode('/',$dir); //当子目录没创建成功时,试图创建父目录,用explode()函数以'/'分隔符切割成一个数组         array_pop($dirArr); //将数组中的最后一项(即子目录)弹出来,         $newDir=implode('/',$dirArr); //重新组合成一个文件夹字符串         Directory($newDir); //试图创建父目录         if(@mkdir($dir,0777)){             echo $dir."创建成功<br>";         } //再次试图创建子目录,成功输出目录名     } } Directory("A/B/C/D/E/F"); 输出结果如图: 但是可以看得出来

C语言-递归二分法查找

只愿长相守 提交于 2020-02-19 06:08:32
#include <stdio.h> int search(int *var, int target, int low, int high) { int mid = (low + high)/2; while (low < high) { if (target > var[mid]) { return search(var, target, mid + 1, high); } else if (target < var[mid]) { return search(var, target, low, mid - 1); } else { printf("The firt matching position is: %d \n", mid); return mid; } } return -1; } int main() { int array[20] = {2, 12, 78, 98, 245, 320, 417, 578, 643, 708, 923, 978, 996, 1002, 1200, 2300, 2398, 2400, 2521, 2888}; int target = 23; int length = sizeof(array)/sizeof(int); if (search(array, target, 0, length) == -1) { printf("Can