码迷,mamicode.com
首页 > 编程语言 > 详细

每周算法(二)

时间:2016-01-18 12:25:05      阅读:299      评论:0      收藏:0      [点我收藏+]

标签:算法 算法基础 数据结构 汉诺塔 递归

每周算法

   视屏地址: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‘);

}


本文出自 “步行千里” 博客,请务必保留此出处http://baosongshan.blog.51cto.com/3929376/1736071

每周算法(二)

标签:算法 算法基础 数据结构 汉诺塔 递归

原文地址:http://baosongshan.blog.51cto.com/3929376/1736071

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!