递归

C语言经典例11-斐波那契数列

落爺英雄遲暮 提交于 2020-02-01 20:28:49
目录 1 题目 2 分析 3 实现 3.1 实现1(递归) 3.2 实现2(非递归) 4 运行结果 1 题目 古典问题(兔子生崽):有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?(输出前40个月即可) 2 分析 将该例建立数学模型,规律为1,1,2,3,5,8, 13, 21, 34, 55, 89, 144, …,即下个月是上两个月之和,该模型在数学上称为fibonacci数列,通过这个规律可以构造递归函数,也可以构造非递归函数计算,显然递归函数的效率非常非常低,但是程序简洁明了。 3 实现 3.1 实现1(递归) # include <stdio.h> int fibonacci ( int n ) { if ( n == 1 || n == 2 ) { return 1 ; } else { return fibonacci ( n - 1 ) + fibonacci ( n - 2 ) ; } } int main ( ) { for ( int i = 1 ; i <= 40 ; i ++ ) { printf ( "第%d个月个数为%d\n" , fibonacci ( i ) ) ; } return 0 ; } 3.2 实现2(非递归) # include <stdio.h>

Python递归函数如何写?正确的Python递归函数用法!

こ雲淡風輕ζ 提交于 2020-02-01 14:29:49
在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。 一、举个例子,我们来计算阶乘n! = 1 x 2 x 3 x … x n,用函数fact(n)表示,可以看出: fact(n) = n! = 1 x 2 x 3 x … x (n-1) x n = (n-1)! x n = fact(n-1) x n 所以,fact(n)可以表示为n x fact(n-1),只有n=1时需要特殊处理。 ps:另外很多人在学习Python的过程中,往往因为没有好的教程或者没人指导从而导致自己容易放弃,为此我建了个Python交流.裙 :一久武其而而流一思(数字的谐音)转换下可以找到了,里面有最新Python教程项目可拿,不懂的问题多跟里面的人交流,都会解决哦! 于是,fact(n)用递归的方式写出来就是: def fact(n): if n==1: return 1 return n * fact(n - 1) 上面就是一个递归函数。可以试试: fact(1) 1 fact(5) 120 fact(100)

LeetCode 70 & 509 & 1137

假如想象 提交于 2020-02-01 09:49:32
文章目录 版权声明 1. LeetCode 70 1.1 复杂度分析 1.2 迭代 2. LeetCode 509 2.1 复杂度分析 2.2 递归 2.3 迭代 3. LeetCode 1137 2.1 复杂度分析 2.2 迭代 References 版权声明 LeetCode 系列笔记来源于 LeetCode 题库 1 ,在个人思考的基础之上博采众长,受益匪浅;故今记此文,感怀于心,更多题解及程序,参见 Github 2 ; 该系列笔记不以盈利为目的,仅用于个人学习、课后复习及交流讨论; 如有侵权,请与本人联系(hqpan@foxmail.com),经核实后即刻删除; 本文采用 署名-非商业性使用-禁止演绎 4.0 国际 (CC BY-NC-ND 4.0) 协议发布; 1. LeetCode 70 1.1 复杂度分析 题意解析: LeetCode 70 爬楼梯问题,亦称青蛙跳台阶问题,该问题的数学模型为 Fibonacci 数列; 设 n 级台阶的跳法有 f ( n ) f(n) f ( n ) 种,则由跳台阶规则可知, f ( n ) = f ( n − 1 ) + f ( n − 2 ) f(n)=f(n-1)+f(n-2) f ( n ) = f ( n − 1 ) + f ( n − 2 ) ; 类似的实际问题还有矩形覆盖问题,给定由 2 × 8 2\times 8 2

顺序存储二叉树

我怕爱的太早我们不能终老 提交于 2020-02-01 08:46:46
顺序存储二叉树 基本说明 从数据存储来看,数组存储方式和树的存储方式可以相互转换 数组 《------》 树 要求:在遍历数组arr时,仍然可以以前序遍历,中序遍历和后序遍历的方式来完成对结点的遍历。 概念 顺序存储二叉树通常仅仅考虑完全二叉树 第n个元素的左子节点为2 * n + 1; 第n个元素的右子节点为2 * n + 2; 第n个节点的父节点为(n - 1) /2; n表示为二叉树中第几个元素(注意:编号是从0开始记的) 图示: 应用实例 八大排序算法中的堆排序,使用的就是顺序存储为叉树。 用顺序存储二叉树实现树的三种遍历 前序遍历: 思路分析: 判断树是否为空 先输出根节点, 在判定左子节点是否为空,在进行左子结点的递归输出 最后判定右子结点是否为空,在进行递归输出 没有了就return 代码实现: public void preOrder ( ) { this . preOrder ( 0 ) ; } //重载方法,是程序看起来更加干净简洁 /**\ * * @param index 标识为数组的下标 * */ public void preOrder ( int index ) { if ( arr == null || arr . length == 0 ) { //有没有数组长度为0,还不为空的数组 //经过实验发现,确实存在如此蛋疼的数组 //两种情况

Go递归函数

不打扰是莪最后的温柔 提交于 2020-02-01 07:02:42
package main import "fmt" func main() { /* 递归函数(recursion):一个函数自己调用自己,就叫做递归函数。 递归函数要有一个出口,逐渐的向出口靠近 */ //1.求1-5的和 sum := getSum(5) fmt.Println(sum) //2.fibonacci数列: /* 1 2 3 4 5 6 7 8 9 10 11 12 。。。 1 1 2 3 5 8 13 21 34 55 89 144 */ res := getFibonacci(12) fmt.Println(res) } func getFibonacci(n int)int{ if n== 1 || n == 2{ return 1 } return getFibonacci(n-1)+getFibonacci(n-2) } func getSum(n int)int{ fmt.Println("**********") if n == 1{ return 1 } return getSum(n-1) + n } /* 求1-5的和 getSum(5) getSum(4) + 5 getSum(3) + 4 getSum(2) + 3 getSum(1) + 2 1 */    来源: https://www.cnblogs.com/yzg-14/p

比较两个字符串是否相等(递归)

末鹿安然 提交于 2020-02-01 06:12:40
先直接上代码吧! 以上是一个正常比较两字符串是否相等的方法,没什么特殊的,接下来我们看一下怎么用递归实现 以上代码是用递归实现两字符串的比较 递归特性:1、相似性 2、找出口 注意:1、首先判断两字符串长度是否相等 2、判断有没有空字符串 3、比较第一个字符串是否相等 4、substring()方法:截取字符串,从下标开始到末尾 来源: CSDN 作者: qq_43989788 链接: https://blog.csdn.net/qq_43989788/article/details/103656656

递归算法

六眼飞鱼酱① 提交于 2020-01-31 19:55:44
用递归计算斐波那契数列,那么什么是斐波那契数列呢?这里引用百度百科的定义:斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波那契数列以如下被以递推的方法定义: F(1)=1,F(2)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 3,n ∈ N*) 代码如下: public class Test01 { public static void main(String[] args) { System.out.println(f(8)); } public static int f(int n) { if(n<=2) { return 1; } return f(n-2)+f(n-1); } } 用递归计算数,需要注意关键的三点。第一,必须有跳出的条件,否则会导致内存溢出,比如上面的代码找到了第8项,递归回调8次就跳出来了;第二,必须给初始值赋值,否则无法计算出数; 第三,需要推导出要计算的表达式。用递归计算斐波那契数列的表达式的规律为,前两项的加起来等于第三项,用数学表达式即为:F(n)=F(n - 1)+F(n - 2) 来源: https://www

递归与回溯思想的应用——以八皇后问题为例

独自空忆成欢 提交于 2020-01-31 14:54:42
1.递归与回溯 1.1递归 乍一听很高深,其实理解起来很轻松,但是面对问题时如何动手编写递归程序却十分棘手! 递归程序的流程图很清晰,非常直观。所谓递归,简单点来说,就是一个函数直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解。 递归与循环有本质区别:简单来说,循环是有去无回,而递归则是有去有回(因为存在终止条件)。 递归与栈的关系:常常听到 “递归的过程就是出入栈的过程”,这句话怎么理解?我们以阶乘代码为例,取 n=3,则过程如下: 第 1~4 步,都是入栈过程,Factorial(3)调用了Factorial(2),Factorial(2)又接着调用Factorial(1),直到Factorial(0); 第 5 步,因 0 是递归结束条件,故不再入栈,此时栈高度为 4,即为我们平时所说的递归深度; 第 6~9 步,Factorial(0)做完,出栈,而Factorial(0)做完意味着Factorial(1)也做完,同样进行出栈,重复下去,直到所有的都出栈完毕,递归结束。 每一个递归程序都可以把它改写为非递归版本。我们只需利用栈,通过入栈和出栈两个操作就可以模拟递归的过程,二叉树的遍历无疑是这方面的代表。但是并不是每个递归程序都是那么容易被改写为非递归的。某些递归程序比较复杂,其入栈和出栈非常繁琐,给编码带来了很大难度

Java使用递归解决迷宫问题

北城以北 提交于 2020-01-31 14:32:22
递归 一、概述 递归就是方法自己调用自己,每次调用时传入不同的变量,**递归有助于编程者解决复杂的问题,**同时可以让代码变得简洁 1. 递归的调用机制 1.1 打印问题 public class RecursionTest { public static void main ( String [ ] args ) { test ( 4 ) ; } public static void test ( int n ) { if ( n > 2 ) { test ( n - 1 ) ; } System . out . println ( "n=" + n ) ; } } 1.2 阶乘问题 public class RecursionTest { public static void main ( String [ ] args ) { int res = factorial ( 3 ) ; System . out . println ( "res=" + res ) ; } /** * 阶乘问题 * @param n * @return */ public static int factorial ( int n ) { if ( n == 1 ) { return 1 ; } else { return factorial ( n - 1 ) * n ; } } } 2.

C# 单向链表 逆序(递归)

你离开我真会死。 提交于 2020-01-31 14:00:13
1 static void Main(string[] args) 2 { 3 while (true) 4 { 5 LinkedList L = new LinkedList(); 6 L.Add(new Node("first")); 7 L.Add(new Node("second")); 8 L.Add(new Node("third")); 9 L.Add(new Node("forth")); 10 Cw(L.Head); 11 L.Head= Reverse(L.Head); 12 Cw(L.Head); 13 Console.ReadKey(); 14 i = 1; 15 } 16 17 } 18 19 private static int i = 1; 20 21 22 //单向链表逆序 23 private static Node Reverse(Node header) 24 { 25 if (header.Next == null) 26 { 27 return header; 28 } 29 //找到最后一个 30 var node = Reverse(header.Next); 31 //后一个的指针 指向前一个 32 header.Next.Next = header; 33 //前一个指针置空 34 header.Next = null; 35