每周算法
二
视屏地址: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‘);
}