每周算法

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

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<

}

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

size_t my_strlen(const char *str)

{

    int count = 0;

    while(*str !='\0')

    {

        count++;

        str++;

    }

    return count;

}

void main()

{

    char *str ="Hello";

    cout<

}

2、  递归法

#include

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<

}

 

二、递归实现n!

1、  累乘法

#include

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<的阶乘为:>"<

}

2、  递归法

#include

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<的阶乘为:>"<

}

 

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

1、  概念法

#include

#include

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<<"第"<"<

}

2、  递归法

#include

#include

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<<"第"<"<

}

 

四、递归实现二分查找

1、  概念法

#include

#include

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

        {

            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:> "<

}

2、  递归法

#include

#include

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:> "<

}

 

五、递归实现汉诺塔

    #include

#include

using namespace std;

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

{

        if(n== 1)

        {

            cout<"<

        }

        else

        {

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

            cout<"<

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

        }

}

void main()

{

        intn;

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

        cin>>n;

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

}