递归函数

2019-12-22-递归-创建二叉树

折月煮酒 提交于 2019-12-22 19:02:46
2019-12-22 /* * 递归创建二叉树 * * */ #include <iostream> using namespace std; struct Tree { int date ; struct Tree *L , *R ; }; //函数insert ,将节点插入二叉树 void Insert(Tree *&proot ,Tree *pnode) { if(proot== NULL){ proot =pnode ; //将节点pnode 插入根节点 } else { //如果pnode 节点 数据小于 proot 插入左子树 if(proot->date >=pnode->date){ Insert(proot->L,pnode) ; } else{ Insert(proot->R,pnode) ; } } } //输出二叉树 void print(Tree *proot) { if(proot == NULL){ return ; } print(proot->L) ; //输出坐子树的内容 cout<<proot->date<<endl ; print(proot->R) ; } int main() { struct Tree *proot =NULL ,*pnode =NULL ; cout<<"请输入要插入节点的数据 "<<endl ; cout<<

数据结构与算法之美之栈、队列和递归

穿精又带淫゛_ 提交于 2019-12-22 00:40:18
栈 栈既可以用数组来实现,也可以用链表来实现。用数组实现的栈,我们叫作顺序栈,用链表实现的栈,我们叫作链式栈 实现方法: package com.smao.leetcode; /** * 数组式链表 */ public class ArrayStack { private String[] arrayStack; private int size;//栈中元素个数 private int count;//栈的容量 public ArrayStack(int count) { this.arrayStack = new String[count]; this.count = count; this.size = 0; } public boolean push(String item){ if(this.count == this.size){ String[] arrayStackNew = new String[this.count*2]; for(int i=0;i<arrayStack.length;i++){ arrayStackNew[i] = arrayStack[i]; this.count = this.count*2; } this.arrayStack = arrayStackNew; } arrayStack[this.size] = item; this

决策树

余生颓废 提交于 2019-12-18 10:47:07
   决策树 是一种基本的分类与回归方法。决策树模型呈树形结构,可以认为是if-then规则的集合,也可以认为是定义在特征空间与类空间上的条件概率分布。其主要优点是模型具有可读性,分类速度快。学习时,利用训练数据,根据损失函数最小化的原则建立决策树模型。预测时,对新的数据,利用决策树模型进行分类。决策树学习通常包括3个步骤: 特征选择 、 决策树的生成 和 决策树的修剪 。    定义(决策树): 决策树由结点(node)和 有向边(directed edge)组成。结点有两种类型:内部结点(internal node)和叶节点(leaf node)。内部结点表示一个特征或属性,叶节点表示一个类。   决策树的路径或其对应的if-then规则集合具有一个重要的性质:互斥并且完备。这就是说,每一个实例都被一条路径或一条规则所覆盖,而且只被一条路径或一条规则所覆盖。   决策树学习的算法通常是一个递归地选择最优特征,并根据该特征对训练数据进行分割,使得对各个子数据集有一个最好的分类的过程。决策树学习算法包括 特征选择 、 决策树生成 与 决策树的剪枝 过程。决策树学习常用的算法有 ID3 、 C4.5 与 CART 。    特征选择    通常特征选择的准则是 信息增益 或 信息增益比 。    特征增益   在信息论与概率统计中,熵(entropy)是表示随机变量不确定性的度量

递归

人盡茶涼 提交于 2019-12-17 04:13:29
# include <stdio.h> int jisuan ( int n ) ; int main ( ) { int n ; scanf ( "%d" , & n ) ; printf ( "n=%d,age=%d" , n , jisuan ( n ) ) ; } int jisuan ( int n ) { if ( n == 1 ) { return 10 ; } else return jisuan ( n - 1 ) + 2 ; } //递归函数的函数调用,首先一 定要有基线情况,返回值的类型处理和之前的相类似; //递归就是在函数内部调用本身函数的过程,最后返回一个结果 //基线情况就是问题元素允许出现的最简单的可能值 //通常情况为if(…) //{ // return a(a就是最简单情况的答案) //} //确定基线情况后再来编写数据较多,元素较多的计算方法,此时调用函数本身 //并且计算的方法为先算题目要求的最后一个,如阶乘:fact(n-1)*n; //如此题:jisuan(n-1)+2; //因为调用是从最后一个数据往前逐个调用,直到遇到基线情况,然后逐步返回到上一步,一层一层的返回 //直到最终返回到第n种情况后从函数返回到主函数 来源: CSDN 作者: zhengrui23751 链接: https://blog.csdn.net

Java实现八大排序算法

痞子三分冷 提交于 2019-12-15 14:34:07
我对java的八大排序算法进行了总结,以此文展示Java八大算法 常见排序算法如下: 1.直接插入排序 2.希尔排序 3.简单选择排序 4.堆排序 5.冒泡排序 6.快速排序 7.归并排序 8.基数排序 排序方法示例简介 直接插入排序 基本思想 通常人们整理桥牌的方法是一张一张的来,将每一张牌插入到其他已经有序的牌中的适当位置。在计算机的实现中,为了要给插入的元素腾出空间,我们需要将其余所有元素在插入之前都向右移动一位。 算法描述 一般来说,插入排序都采用in-place在数组上实现。具体算法描述如下: 从第一个元素开始,该元素可以认为已经被排序 取出下一个元素,在已经排序的元素序列中从后向前扫描 如果该元素(已排序)大于新元素,将该元素移到下一位置 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置 将新元素插入到该位置后 重复步骤2~5 注意: 如果 比较操作 的代价比 交换操作 大的话,可以采用二分查找法来减少 比较操作 的数目。该算法可以认为是 插入排序 的一个变种,称为二分查找插入排序。 代码实现 /** * 通过交换进行插入排序,借鉴冒泡排序 * * @param a */ public static void sort ( int [ ] a ) { for ( int i = 0 ; i < a . length - 1 ; i ++ ) { for (

C语言:函数-递归

半世苍凉 提交于 2019-12-15 13:26:22
# include <stdio.h> int fn ( int num ) ; int main ( ) { int i , sum ; for ( i = 1 , sum = 0 ; i <= 100 ; i ++ ) { sum + = i ; } printf ( "sum=%d\r\n" , sum ) ; sum = fn ( 5 ) ; printf ( "sum=%d\r\n" , sum ) ; return 0 ; } int fn ( int num ) { if ( num == 1 ) { return 1 ; } return num + fn ( num - 1 ) ; } /* fn(1) = 1 fn(2) = 2 + fn(2 - 1) = 2 + fn(1) = 2 + 1 = 3 fn(3) = 3 + fn(3 - 1) = 3 + fn(2) = 3 + 2 + 1 = 6 fn(4) = 4 + fn(4 - 1) = 4 + fn(3) = 4 + 3 + 2 + 1 = 10 fn(100) = 100 + fn(100 - 1) = 100 + fn(99) = 100 + 99 ... 100 的 累加 相当于 100 加上 99 的 累加 */ 来源: CSDN 作者: hahahafree 链接: https://blog

抛硬币--函数递归

不打扰是莪最后的温柔 提交于 2019-12-12 02:46:01
学习记录–连续抛硬币N次,那么不连续出现正面的可能情况有多少种(即任何相邻两次都不全是正面) 输入只有一行一个整数N,表示抛N次硬币。(1≤N≤14 ) 写一个程序,输出所有的可能情况(用0表示反面,1表示正面)。 输出有M+1行。 前M行输出每一种可能情况,不同情况按照字典序从小到大排列。 最后一行输出一个数字M,表示不连续出现正面的可能情况的总数。 # include <stdio.h> void coin ( int step ) ; void PRINT_count ( ) ; int n , str [ 15 ] , count = 0 ; //n代表抛硬币次数 int main ( ) { int count ; scanf ( "%d" , & n ) ; coin ( 0 ) ; PRINT_count ( ) ; } void coin ( int step ) { int i , j ; if ( step == n ) { for ( j = 0 ; j < n ; j ++ ) { if ( str [ j ] == 1 && str [ j + 1 ] == 1 ) //排除连续为1的情况 return ; } for ( i = 0 ; i < n ; i ++ ) printf ( "%d" , str [ i ] ) ; //打印情况 if ( i

6-1 使用递归函数计算1到n之和 (10分)

梦想与她 提交于 2019-12-11 22:30:51
6-1 使用递归函数计算1到n之和 (10分) 欢迎使用Markdown编辑器 本题要求实现一个用递归计算1+2+3+…+n的和的简单函数。 函数接口定义: int sum( int n ); 该函数对于传入的正整数n返回1+2+3+…+n的和;若n不是正整数则返回0。题目保证输入输出在长整型范围内。建议尝试写成递归函数。 裁判测试程序样例: #include <stdio.h> int sum( int n ); int main() { int n; scanf("%d", &n); printf ("%d\n", sum(n)); return 0; } /* 你的代码将被嵌在这里 */ 输入样例1: 10 输出样例1: 55 输入样例2: 0 输出样例2: 0 int sum( int n ) { int result; if(n<=0) result=0; else if(n==1) result=1; else result=sum(n-1)+n; return result; } 新的改变 我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客: 全新的界面设计 ,将会带来全新的写作体验; 在创作中心设置你喜爱的代码高亮样式,Markdown 将代码片显示选择的高亮样式 进行展示;

二叉树非递归遍历

血红的双手。 提交于 2019-12-11 19:30:18
上码: 1 #include <iostream> 2 #include <string> 3 #include <stack> 4 #include <queue> 5 using namespace std; 6 7 template<class T> 8 struct BiNode { 9 T data; 10 BiNode<T> *lchild, *rchild;//左子树、右子树 11 }; 12 13 template<class T> 14 class BiTree 15 { 16 public: 17 BiTree(); //构造函数,初始化二叉树,前序序列由键盘输入 18 ~BiTree(); //析构函数,释放二叉链表中的各结点的存储空间 19 BiNode<T>* Getroot(); //获得指向根节点的指针 20 void PreOrder(BiNode<T>* root); //前序遍历二叉树 21 void InOrder(BiNode<T>* root); //中序遍历二叉树 22 void PostOrder(BiNode<T>* root); //后序遍历二叉树 23 void LeverOrder(BiNode<T>* root); //层序遍历二叉树 24 25 void NonPreOrder(BiNode<T>* root); 26

汉罗塔(递归和分治)

十年热恋 提交于 2019-12-10 13:10:06
题意:有一个梵塔,塔内有三个座A、B、C,A座上有诺干个盘子,盘子大小不等,大的在下,小的在上(如图)。 把这些个盘子从A座移到C座,中间可以借用B座但每次只能允许移动一个盘子,并且在移动过程中,3个座上的盘 子始终保持大盘在下,小盘在上。 描述简化:把A柱上的n个盘子移动到C柱,其中可以借用B柱。 解法:整体考虑忽略中间过程。 状态0:A:按顺序堆放n个盘子。B:空 。C: 空。 状态1:A:按顺序堆放1个盘子。B:n-1个盘子。 C:空。 状态2:A:空。B:n-1个盘子。C:1个盘子。 此时可以将C看成是空,因为C的盘子是大于其他座上的盘子。 此时状态与状态0一样只是是从B座移到C座。 状态3:A:空。B:空。C:n个盘子。 定义函数Hanoi(n , a , b , c)表示将n个盘子从a座移到c座。 该操可以分治进行如下三个操作: 1、Hanoi(n-1 , a , c , b)表示将n-1个盘子从a座移到b座。 2、move(a,c)表示将1个盘子从a座移到c座。 3、Hanoi(n-1 , b , a , c)表示将n-1个盘子从b座移到c座 //#include <bits/stdc++.h> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include