每週算法(二)

每週算法html

ios

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


一、  遞歸實現my_strlenide

<1> 題目描述:實現求字符串長度函數my_strlen函數

<2> 方法一:直接法spa

<3> 方法二:遞歸法htm

 

二、  遞歸實現n!遞歸

<1> 題目描述:輸入n值,求解n的階乘ci

<2> 方法一:累乘法字符串

<3> 方法二:遞歸法

 

三、  遞歸實現斐波那契數列Fib(n)

<1> 題目描述:輸入n值,求解第n項的斐波那契數列值

<2> 方法一:概念法

<3> 方法二:遞歸法

 

四、  遞歸實現二分查找

<1> 題目描述:針對數據,進行二分查找(要求:數據的排列有序)

<2> 方法一:概念法

<3> 方法二:遞歸法

 

五、  遞歸實現漢諾塔

<1> 題目描述:輸入n值,實現n個盤子的漢諾塔移動

<2> 方法:遞歸法

 

源碼:

1、遞歸實現my_strlen

一、  直接法

#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;

}

二、  遞歸法

#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;

}

 

2、遞歸實現n!

一、  累乘法

#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;

}

二、  遞歸法

#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;

}

 

3、遞歸實現斐波那契數列Fib(n)

一、  概念法

#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;

}

二、  遞歸法

#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;

}

 

4、遞歸實現二分查找

一、  概念法

#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;

}

二、  遞歸法

#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;

}

 

5、遞歸實現漢諾塔

    #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');

}

相關文章
相關標籤/搜索