每週算法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');
}