-
递归法
2020-01-21 17:47:34递归法: 1)定义: 递归就是自己调用自己。 2)另外: 能不用递归就不要用递归,因为递归其实就是系统为你压栈了,系统会把所有的东西都压栈(不管你用不用得到),所以造成了递归耗内存。可以用循环来代替递归...递归法:
1)定义:
递归就是自己调用自己。
2)另外:
能不用递归就不要用递归,因为递归其实就是系统为你压栈了,系统会把所有的东西都压栈(不管你用不用得到),所以造成了递归耗内存。可以用循环来代替递归,自己实现压栈,压入自己需要用到的东西就好。
3)如何计算递归的时间复杂度
4)例子:
(1)问题描述:
求全排列。
(2)基本思路:
就是第一层perm固定了第一个元素arr[0],第二层固定了第二个元素arr[1],以此类推,到最后一个的时候就输出数组。
(3)Java代码实现:public class digui { public static void main(String[] args) { int arr[]= {1,2,3,4}; perm(arr,0,arr.length-1);//求得/打印出 数组arr从0到arr.length-1的全排列 } public static void swap(int arr[],int x, int y) { int temp = arr[x]; arr[x]=arr[y]; arr[y]=temp; } public static void perm(int arr[],int begin ,int end) { if(end==begin) { for(int i =0;i<=end;i++) { System.out.print(arr[i]+" "); } System.out.println();//用来使得每个排列在不同的行上,过行作用 return; }else { for(int j =begin;j<=end;j++) { swap(arr,begin,j);//更换第一个数的数值 perm(arr,begin+1,end);//求得arr除了第一位数以后的全排列 swap(arr,begin,j);//更换回去原来的第一个数,以便下次的操作 } } } }
运行结果: 1 2 3 4 1 2 4 3 1 3 2 4 1 3 4 2 1 4 3 2 1 4 2 3 2 1 3 4 2 1 4 3 2 3 1 4 2 3 4 1 2 4 3 1 2 4 1 3 3 2 1 4 3 2 4 1 3 1 2 4 3 1 4 2 3 4 1 2 3 4 2 1 4 2 3 1 4 2 1 3 4 3 2 1 4 3 1 2 4 1 3 2 4 1 2 3
时间复杂度: O(n!)
空间复杂度: O(1)
-
e语言-易语言递归法取排列组合例程(M选N递归法)
2019-08-23 12:29:31易语言递归法取排列组合例程(M选N递归法),源码可以学习到递归法。 -
树的高度 递归法和非递归法
2019-05-10 12:01:58递归法思路: 树的高度即节点子树的高度+1(节点子树的高度即左子树高度,右子树高度的最大值) 代码如下: // Height_Recursive 递归法求树的高度 int Height_Recursive(TreeNode* pTree) { if (pTree == NULL...递归法思路:
树的高度即节点子树的高度+1(节点子树的高度即左子树高度,右子树高度的最大值)
代码如下:
// Height_Recursive 递归法求树的高度 int Height_Recursive(TreeNode* pTree) { if (pTree == NULL) { return 0; } // 分别求出左子树,右子树的高度,取最大值+1 int leftHeight = Height_Recursive(pTree->left); int rightHeight = Height_Recursive(pTree->right); return (leftHeight > rightHeight ? leftHeight: rightHeight)+1; }
非递归法思路:
借鉴程序遍历的思想,一层层的遍历,累加层数即可得到树的高度
代码如下:
// Height_No_Recursive 非递归法求树的高度 // 思路:借鉴层序遍历的思想,一层层的遍历,层数即高度 int Height_No_Recursive(TreeNode* pTree) { if (pTree == NULL) { return 0; } queue<TreeNode*> que; que.push(pTree); int height = 0; TreeNode* p = NULL; while(!que.empty()) { height++; // 该层的节点个数,压入所有节点的孩子节点 int num = que.size(); for (int i=0;i<num;i++) { p = que.front(); que.pop(); if (p->left != NULL) { que.push(p->left); } if (p->right != NULL) { que.push(p->right); } } } return height; }
实验结果如下图:
完整代码如下:
#include<iostream> #include<queue> using namespace std; // 树(节点)定义 struct TreeNode { int data; // 值 TreeNode* left; // 左节点 TreeNode* right;// 右节点 }; // 按照前序建立二叉树,这里我们建立下面的树 // 8 // 6 10 // 4 7 12 // 11 // 所以输入顺序是:8 6 4 0 0 7 0 0 10 0 12 11 0 0 0 void createTree(TreeNode*& t) { cout<<"请输入数据:"<<endl; int val = 0; cin>>val; // 0表结束 if (0 == val) { t = NULL; } else { t = new TreeNode(); t->data = val; cout<<"开始建立:"<<val<<"的左节点:"; createTree(t->left); cout<<"开始建立:"<<val<<"右节点:"; createTree(t->right); } } // Height_Recursive 递归法求树的高度 int Height_Recursive(TreeNode* pTree) { if (pTree == NULL) { return 0; } // 分别求出左子树,右子树的高度,取最大值+1 int leftHeight = Height_Recursive(pTree->left); int rightHeight = Height_Recursive(pTree->right); return (leftHeight > rightHeight ? leftHeight: rightHeight)+1; } // Height_No_Recursive 非递归法求树的高度 // 思路:借鉴层序遍历的思想,一层层的遍历,层数即高度 int Height_No_Recursive(TreeNode* pTree) { if (pTree == NULL) { return 0; } queue<TreeNode*> que; que.push(pTree); int height = 0; TreeNode* p = NULL; while(!que.empty()) { height++; // 该层的节点个数,压入所有节点的孩子节点 int num = que.size(); for (int i=0;i<num;i++) { p = que.front(); que.pop(); if (p->left != NULL) { que.push(p->left); } if (p->right != NULL) { que.push(p->right); } } } return height; } int main() { TreeNode* pTree = NULL; createTree(pTree); cout<<"\n递归法求树的高度"<<endl; cout<<Height_Recursive(pTree)<<endl; cout<<"\n非递归法求树的高度"<<endl; cout<<Height_No_Recursive(pTree)<<endl; return 0; }
-
树的宽度 递归法和非递归法
2019-05-10 22:23:10递归法思路: 建立一个数组,count[1]表第1层节点总数,即宽度,count[2]表第二层节点总数,依次类推 用先序遍历二叉树,每深入一层就把该层的节点个数加1,最大节点数即树的宽度 代码如下: // Width_No_Recursive 非...递归法思路:
建立一个数组,count[1]表第1层节点总数,即宽度,count[2]表第二层节点总数,依次类推
用先序遍历二叉树,每深入一层就把该层的节点个数加1,最大节点数即树的宽度代码如下:
// Width_No_Recursive 非递归法求树的宽度 // 思路:借鉴层序遍历的思想,一层层的遍历,所有层中最大宽度,即树的宽度 int Width_No_Recursive(TreeNode* pTree) { if (pTree == NULL) { return 0; } queue<TreeNode*> que; que.push(pTree); int max_weight = 1; TreeNode* p = NULL; while(!que.empty()) { // 该层的节点个数,即该层的宽度 // 弹出该层的节点后,再压入所有节点的孩子节点,即下一层的节点 int num = que.size(); if (num > max_weight) { max_weight = num; } for (int i=0;i<num;i++) { p = que.front(); que.pop(); if (p->left != NULL) { que.push(p->left); } if (p->right != NULL) { que.push(p->right); } } } return max_weight; }
非递归法思路:
借鉴层序遍历的思想,一层层的遍历,所有层中最大宽度,即树的宽度
代码如下:
// 统计第level层的节点树 void width(TreeNode* pTree, int* count, int level, int& max) { if (pTree == NULL) { return; } // 该层次节点数加1 count[level]++; // max一直保存最大宽度 if (count[level] > max) { max = count[level]; } // 往下层递归 width(pTree->left,count,level+1,max); width(pTree->right,count,level+1,max); } // Width_Recursive 递归法求树的宽度 // 思路:建立一个数组,count[1]表第1层节点总数,即宽度,count[2]表第二层节点总数,依次类推 // 用先序遍历二叉树,每深入一层就把该层的节点个数加1,最大节点数即树的宽度 int Width_Recursive(TreeNode* pTree) { if (pTree == NULL) { return 0; } int count[100] = {0}; // 全局数组 int max = 0; // 宽度 //递归求树的最大宽度 width(pTree,count,1,max); return max; }
实验结果如下图:
完整代码如下:
#include<iostream> #include<queue> using namespace std; // 树(节点)定义 struct TreeNode { int data; // 值 TreeNode* left; // 左节点 TreeNode* right;// 右节点 }; // 按照前序建立二叉树,这里我们建立下面的树 // 8 // 6 10 // 4 7 12 // 11 // 所以输入顺序是:8 6 4 0 0 7 0 0 10 0 12 11 0 0 0 void createTree(TreeNode*& t) { cout<<"请输入数据:"<<endl; int val = 0; cin>>val; // 0表结束 if (0 == val) { t = NULL; } else { t = new TreeNode(); t->data = val; cout<<"开始建立:"<<val<<"的左节点:"; createTree(t->left); cout<<"开始建立:"<<val<<"右节点:"; createTree(t->right); } } // 统计第level层的节点树 void width(TreeNode* pTree, int* count, int level, int& max) { if (pTree == NULL) { return; } // 该层次节点数加1 count[level]++; // max一直保存最大宽度 if (count[level] > max) { max = count[level]; } // 往下层递归 width(pTree->left,count,level+1,max); width(pTree->right,count,level+1,max); } // Width_Recursive 递归法求树的宽度 // 思路:建立一个数组,count[1]表第1层节点总数,即宽度,count[2]表第二层节点总数,依次类推 // 用先序遍历二叉树,每深入一层就把该层的节点个数加1,最大节点数即树的宽度 int Width_Recursive(TreeNode* pTree) { if (pTree == NULL) { return 0; } int count[100] = {0}; // 全局数组 int max = 0; // 宽度 //递归求树的最大宽度 width(pTree,count,1,max); return max; } // Width_No_Recursive 非递归法求树的宽度 // 思路:借鉴层序遍历的思想,一层层的遍历,所有层中最大宽度,即树的宽度 int Width_No_Recursive(TreeNode* pTree) { if (pTree == NULL) { return 0; } queue<TreeNode*> que; que.push(pTree); int max_weight = 1; TreeNode* p = NULL; while(!que.empty()) { // 该层的节点个数,即该层的宽度 // 弹出该层的节点后,再压入所有节点的孩子节点,即下一层的节点 int num = que.size(); if (num > max_weight) { max_weight = num; } for (int i=0;i<num;i++) { p = que.front(); que.pop(); if (p->left != NULL) { que.push(p->left); } if (p->right != NULL) { que.push(p->right); } } } return max_weight; } int main() { TreeNode* pTree = NULL; createTree(pTree); cout<<"\n递归法求树的宽度"<<endl; cout<<Width_Recursive(pTree)<<endl; cout<<"\n非递归法求树的宽度"<<endl; cout<<Width_No_Recursive(pTree)<<endl; return 0; }
-
用递归法和非递归法实现n的阶乘
2018-10-02 15:05:02用递归法和非递归法实现n的阶乘 #include <stdio.h> int fac(int n) //递归 { if(n<0) { printf("n<0,data error!\n"); } else if(n==0 || n==1) return 1; else ...用递归法和非递归法实现n的阶乘
#include <stdio.h> int fac(int n) //递归 { if(n<0) { printf("n<0,data error!\n"); } else if(n==0 || n==1) return 1; else { return n*fac(n-1); } return 0; } int fac_f(int n) //非递归 { int sum=1; for(;n>0;n--) { sum *=n; } return sum; } int main() { int n,ret=0,ret2=0; printf("input an interger number:\n"); scanf("%d",&n); ret=fac(n); ret2=fac_f(n); printf("递归法:%d!= %d\n",n,ret); printf("非递归法:%d!= %d\n",n,ret2); return 0; }
-
递归法和非递归法遍历二叉树、层次遍历
2020-02-04 17:17:18递归法遍历二叉树 遍历二叉树是指按某条搜索路径巡访树中的每个结点,使得每个结点均被访问一次,而且仅被访问一次 访问的含义很广,可以是对结点做各种处理,包括输出结点的信息,对结点进行运算和修改等 先序... -
递归法取排列组合易语言源码例程.rar
2020-03-29 03:19:32递归法取排列组合易语言源码例程.rar 递归法取排列组合易语言源码例程.rar 递归法取排列组合易语言源码例程.rar 递归法取排列组合易语言源码例程.rar 递归法取排列组合易语言源码例程.rar 递归法取排列组合... -
易语言递归法取排列组合例程源码
2020-07-22 11:29:39易语言递归法取排列组合例程源码,递归法取排列组合例程,子程序_取组合 -
用递归法和非递归法求第N个斐波那契数
2017-11-04 21:14:581.递归法 #include #include int fib(int n) {if(n) return 1; else return fib(n-1)+fib(n-2); } int main() {int n=0; printf("请输入n"); scanf("%d\n",&n); system("pause"); return 0; } 2.非递归法 #include... -
【编程】C语言入门:递归法、非递归法——求第n个斐波那契数
2020-11-29 09:24:53//求第n个斐波那契数(递归法) //1、1、2、3、5、8、13、21、34、…… int fib(int n) { if (n <= 2) return 1; else return fib(n - 1) + fib(n - 2); } int main() { int n = 8; prin -
java递归法求字符串逆序
2020-09-03 16:36:19主要介绍了java递归法求字符串逆序,涉及java递归调用的相关操作技巧,需要的朋友可以参考下 -
leetcode 145. Binary Tree Postorder Traversal(二叉树的后序遍历,递归法,非递归法))
2019-06-20 11:12:35Binary Tree Inorder Traversal (二叉树的中序遍历,递归法,非递归法) 解答: leetcode 144. Binary Tree Preorder Traversal(二叉树的前序遍历,递归法,非递归法) 示例 /* Example */ Inp... -
【c++算法】《二分查找法》——递归和非递归法
2020-06-28 14:13:02本文讲解二分查找法的两种实现方法——递归法和非递归法 -
递归法解决兔子问题
2020-07-04 12:04:45递归法解决兔子问题 -
递归法求和
2016-02-22 11:51:03public class 递归法求和 { /** * @param 递归法求和 */ public static void main(String[] args) { int n = 100; System.out.print("1+~+"+n+"="); System.out.println(sum(n)); } static int sum(int... -
leetcode 144. Binary Tree Preorder Traversal(二叉树的前序遍历,递归法,非递归法)
2019-01-12 11:12:10题目要求 给定一个二叉树,返回前序遍历的结果。... Binary Tree Inorder Traversal (二叉树的中序遍历,递归法,非递归法) 示例 /* Example */ Input: [1,null,2,3] 1 \ 2 / 3 Output: [1,2,3] 解题思路... -
数据结构之递归法和分治法
2020-06-15 20:38:23递归法和分治法一、递归与堆栈二、基于归纳的递归三、递推关系求解四、分治法1、基本思想五、例题一、递归例题简单例题中等例题困难例题二、分治例题简单例题中等例题困难例题 一、递归与堆栈 1、递归(recursion)是... -
【分治递归法】顺序表应用7:最大子段和之分治递归法
2017-09-20 20:18:521知识点:分治递归法求最大子段和顺序表应用7:最大子段和之分治递归法——SDUT题目链接 Time Limit: 10MS Memory Limit: 400KBProblem Description 给定n(1)个整数(可能为负数)组成的序列a[1],a[2],a[3],…,a... -
函数用递归法求最大公约数
2020-11-03 11:15:29提交内容只有 该需要实现的函数,不需要main难度系数1 递归法求两个数的最大公约数 (5分) 递归法求两个数的最大公约数。其中 m 和 n 都是用户传入的参数。函数用递归法求m 和 n的最大公约数</p> -
二叉树的三种遍历递归法和非递归法(前序、中序、后续)
2017-05-29 12:51:16二叉树的前序遍历:根->左->右1、递归方法:思路:我们知道递归就是将一个大问题不断分成子...例如下面这个二叉树递归过程:转化成代码代码:void PrevOrder() //1、递归法 { Node* root = _Root; _PrevOrder(roo -
【面试题】剑指offer09--递归法和非递归法斐波那契数列的第n个数
2017-06-14 10:57:01【面试题】剑指offer09--递归法和非递归法斐波那契数列的第n个数 -
递归法和循环法求n!
2019-01-14 12:49:46递归法和循环法求n! 思路分析:循环法:调用for循环,依次累乘 递归法: 递推关系:n*Fun(n-1);Fun()为求阶乘函数; 出口:n<2; 完整程序: #define _CRT_SECURE_NO_WARNINGS #include<... -
c++递归实例 以及递归法的优化
2018-06-10 21:03:00废话不多说,下面利用C++以及递归法解决一个经典的迭代问题。问题描述: 假如第一个月买入一对幼兔,已知每一对幼兔能够在三个月后生产一队幼兔,那么请问第N个月后总共能得到几对兔子?问题分析:每一对兔子都会在... -
C语言递归法和非递归法分别实现strlen
2020-09-13 19:15:53递归: #include<stdio.h> //递归实现strlen int my_strlen(char* p) { if (*p != '\0') { return 1 + my_strlen(p+1); } return 0; } int main() { char arr[] = "hellobit"; int ret = my_strlen... -
C语言 递归法求阶乘
2020-08-30 18:18:05C语言 递归法求阶乘 利用一个函数进行递归求阶乘,但该数不能小于0,且若为0或1,得到的结果都为1,其他情况,对该数不断递归 #include <stdio.h> #include <stdlib.h> int main() { int fac(int n); /... -
插入排序递归法
2017-01-12 23:02:26很久没写博客了,今晚学习算法的东西,有个练习要用递归法来做插入排序,花了10多分钟弄出来了。 对我来说,迭代相对于递归更好理解,一直没有递归的思想,今天完全凭自己做出来了,别的不说,起码加深了对递归的...
收藏数
22,063
精华内容
8,825