每周算法(二)

每周算法

视屏地址:http://edu.51cto.com/course/course_id-5113.html

1、  递归实现my_strlen

<1> 题目描述:实现求字符串长度函数my_strlen

<2> 方法一:直接法

<3> 方法二:递归法

2、  递归实现n!

<1> 题目描述:输入n值,求解n的阶乘

<2> 方法一:累乘法

<3> 方法二:递归法

3、  递归实现斐波那契数列Fib(n)

<1> 题目描述:输入n值,求解第n项的斐波那契数列值

<2> 方法一:概念法

<3> 方法二:递归法

4、  递归实现二分查找

<1> 题目描述:针对数据,进行二分查找(要求:数据的排列有序)

<2> 方法一:概念法

<3> 方法二:递归法

5、  递归实现汉诺塔

<1> 题目描述:输入n值,实现n个盘子的汉诺塔移动

<2> 方法:递归法

源码:

一、递归实现my_strlen

1、  直接法

#include<iostream>

using namespace std;

size_t my_strlen(const char *str)

{

for(int i=0;*str!=‘\0‘; ++i);

return i;

}

void main()

{

char *str ="Hello";

cout<<strlen(str)<<endl;

}

/////////////////////////////////////////////////

size_t my_strlen(const char *str)

{

int count = 0;

while(*str !=‘\0‘)

{

count++;

str++;

}

return count;

}

void main()

{

char *str ="Hello";

cout<<strlen(str)<<endl;

}

2、  递归法

#include<iostream>

using namespace std;

size_t my_strlen(const char *str)

{

if(*str ==‘\0‘)

return 0;

else

returnmy_strlen(str+1)+1;

}

void main()

{

char *str ="Hello";

cout<<strlen(str)<<endl;

}

二、递归实现n!

1、  累乘法

#include<iostream>

using namespace std;

#define UL unsigned long

UL Factorial(UL n)

{

int sum = 1;

for(int i=1;i<=n; ++i)

{

sum *= i;

}

return sum;

}

void main()

{

UL n;

cout<<"请输入n:>";

cin>>n;

cout<<n<<"的阶乘为:>"<<Factorial(n)<<endl;

}

2、  递归法

#include<iostream>

using namespace std;

#define UL unsigned long

UL Factorial(UL n)

{

if(n == 0)

return 1;

else

return n *Factorial(n-1);

}

void main()

{

UL n;

cout<<"请输入n:>";

cin>>n;

cout<<n<<"的阶乘为:>"<<Factorial(n)<<endl;

}

三、递归实现斐波那契数列Fib(n)

1、  概念法

#include<iostream>

#include<assert.h>

using namespace std;

unsigned int Fib(unsigned int n)

{

unsigned intfib1 = 1;

unsigned intfib2 = 1;

unsigned intfib;

for(int i=3;i<=n; ++i)

{

fib = fib1+ fib2;

fib1 =fib2;

fib2 = fib;

}

return fib;

}

void main()

{

unsigned int n;

cout<<"请输入n:";

cin>>n;

cout<<"第"<<n<<"项的斐波那契值为:>"<<Fib(n)<<endl;

}

2、  递归法

#include<iostream>

#include<assert.h>

using namespace std;

unsigned int Fib(unsigned int n)

{

if(n==1 ||n==2)

return 1;

else

returnFib(n-1)+Fib(n-2);

}

void main()

{

unsigned int n;

cout<<"请输入n:";

cin>>n;

cout<<"第"<<n<<"项的斐波那契值为:>"<<Fib(n)<<endl;

}

四、递归实现二分查找

1、  概念法

#include<iostream>

#include<assert.h>

using namespace std;

int Search(int ar[], int n, int key)

{

int low = 0;

int high = n-1;

int mid;

while(low <=high)

{

mid = (low+high)/2;

if(key <ar[mid])

{

high =mid-1;

}

else if(key> ar[mid])

{

low =mid+1;

}

else

returnmid;

}

return -1;

}

void main()

{

int ar[10] ={12,23,34,45,56,67,78,89,90,100};

int n =sizeof(ar)/sizeof(int);

int key;

cout<<"请输入要查找的key值:>";

cin>>key;

cout<<"pos:> "<<Search(ar,n,key)<<endl;

}

2、  递归法

#include<iostream>

#include<assert.h>

using namespace std;

int Search(int ar[], int low, int high, int key)

{

if(low >high)

return -1;

int mid =(low+high)/2;

if(key == ar[mid])

return mid;

else if(key< ar[mid])

returnSearch(ar,low,mid-1,key);

else

returnSearch(ar,mid+1,high,key);

}

void main()

{

int ar[10] ={12,23,34,45,56,67,78,89,90,100};

int n =sizeof(ar)/sizeof(int);

int key;

cout<<"请输入要查找的key值:>";

cin>>key;

cout<<"pos:> "<<Search(ar,0,n-1,key)<<endl;

}

五、递归实现汉诺塔

#include<iostream>

#include<assert.h>

using namespace std;

void Move(int n, char A, char B, char C)

{

if(n== 1)

{

cout<<A<<"-->"<<C<<endl;

}

else

{

Move(n-1,A,C,B);

cout<<A<<"-->"<<C<<endl;

Move(n-1,B,A,C);

}

}

void main()

{

intn;

cout<<"请输入圆盘的个数n:>";

cin>>n;

Move(n,‘A‘,‘B‘,‘C‘);

}

时间: 2024-10-12 23:39:16

每周算法(二)的相关文章

数据结构与算法二

1.课程安排表: 1. 线性表 2. 字符串 3. 栈和队列 4.树 5.查找 6.排序 7.暴力枚举法 8.广度优先搜索 9.深度优先搜索 10.分治 11.贪心 12.动态规划 13.图 14.数学方法与常见模型 15.大整数运算 16. 基础功能 2.   编程技巧: 1.把较大的数组放在main 函数(全局变量)外,作为全局变量,这样可以防止栈溢出,因为栈的大小是有限制的.GCC (C编译器) 段错误 2.如果能够预估栈,队列的上限,则不要用stack,queue,使用数组来模拟,这样速

Graham算法—二维点集VC++实现

一.凸包定义 通俗的说就是:一组平面上的点,求一个包含所有点的最小凸多边形,这个最小凸多边形就是凸包. 二.Graham算法思想 概要:Graham算法的主要思想就是,最终形成的凸包,即包围所有点的凸多边形,假定多边形是按逆时针方向生成的,那么多边形内部包围的所有点与多边形每个有向边的关系都是:点在有向边的左边.依照此思想,只要找到一个出发点,然后依此出发点按逆时针方向构建多边形,并保证每加入一条有向边时,都要满足其余点都在该边的左边. ***点与线的关系定义:平面上的三点P1(x1,y1),P

Kruskal算法(二)之 C++详解

本章是克鲁斯卡尔算法的C++实现. 目录 1. 最小生成树 2. 克鲁斯卡尔算法介绍 3. 克鲁斯卡尔算法图解 4. 克鲁斯卡尔算法分析 5. 克鲁斯卡尔算法的代码说明 6. 克鲁斯卡尔算法的源码 转载请注明出处:http://www.cnblogs.com/skywang12345/ 更多内容:数据结构与算法系列 目录 最小生成树 在含有n个顶点的连通图中选择n-1条边,构成一棵极小连通子图,并使该连通子图中n-1条边上权值之和达到最小,则称其为连通网的最小生成树. 例如,对于如上图G4所示的

白话经典算法二叉堆排序之思想简介

常用的排序算法有冒泡排序,插入排序和选择排序.他们的时间复杂度是o(n2),与数据量的平方成正比.他们的效率还是比较低的.现在来说说他们的效率为什么比较低下.以冒泡排序为例,它每一轮都是与相邻的元素进行交换,交换的距离为1,每次每个(没有冒泡出来的)元素都要与前一个比较再交换.每次相邻的比较只能比较出两个元素的大小,不能以整个数组进行参照来确定在整个数组里的大小,也就是说每次的比较不能确定其他元素的相对位置,因而每次比较的贡献不大,所以这样的比较是笨拙的,进而需要完全比较O(n2)次才能得出正确

{区块链教程}以太坊源码分析fast sync算法二

{区块链教程}以太坊源码分析fast sync算法二:上面的表格应该这样解释:如果我们每隔K个区块头验证一次区块头,在N个区块头之后,伪造的概率小于***者产生SHA3冲突的概率.这也意味着,如果确实发现了伪造,那么最后的N个头部应该被丢弃,因为不够安全.可以从上表中选择任何{N,K}对,为了选择一个看起来好看点的数字,我们选择N = 2048,K = 100.后续可能会根据网络带宽/延迟影响以及可能在一些CPU性能比较受限的设备上运行的情况来进行调整. Using this caveat ho

机器学习算法( 二、K - 近邻算法)

一.概述 k-近邻算法采用测量不同特征值之间的距离方法进行分类. 工作原理:首先有一个样本数据集合(训练样本集),并且样本数据集合中每条数据都存在标签(分类),即我们知道样本数据中每一条数据与所属分类的对应关系,输入没有标签的数据之后,将新数据的每个特征与样本集的数据对应的特征进行比较(欧式距离运算),然后算出新数据与样本集中特征最相似(最近邻)的数据的分类标签,一般我们选择样本数据集中前k个最相似的数据,然后再从k个数据集中选出出现分类最多的分类作为新数据的分类. 二.优缺点 优点:精度高.对

算法—二叉堆

实现栈或是队列与实现优先队列的最大不同在于对性能的要求.对于栈和队列,我们的实现能够在常数时间内完成所有操作:而对于优先队列,插入元素和删除最大元素这两个操作之一在最坏情况下需要线性时间来完成.我们接下来要讨论的基于数据结构堆的实现能够保证这两种操作都能更快地执行. 1.堆的定义 数据结构二叉堆能够很好地实现优先队列的基本操作.在二叉堆的数组中,每个元素都要保证大于等于另两个特定位置的元素.相应地,这些位置的元素又至少要大于等于数组中的另两个元素,以此类推.如果我们将所有元素画成一棵二叉树,将每

排序算法二:归并排序(Merge sort)

归并排序(Merge sort)用到了分治思想,即分-治-合三步,算法平均时间复杂度是o(nlgn). (一)算法实现 1 private void merge_sort(int[] array, int first, int last) { 2 if (first + 1 < last) { 3 int mid = (first + last) / 2; 4 merge_sort(array, first, mid); 5 merge_sort(array, mid, last); 6 7 /

算法二之树形选择排序

一.树形选择排序的基本思想 (1) 树形选择排序又称锦标赛排序(Tournament Sort),是一种按照锦标赛的思想进行选择排序的方法.首先对n个记录的关键字进行两两比较,然后在n/2个较小者之间再进行两两比较,如此重复,直至选出最小的记录为止. (2) 树形选择排序(Tree Selection Sort),这个过程可用一棵有n个叶子结点的完全二叉树表示. 例如,图表中的二叉树表示从8个数中选出最小数的过程. 8个叶子结点到根接点中的关键字,每个非终端结点中的数均等于其左右孩子结点中较小的