算法设计与分析之递归算法练习(上)
递归算法一:阶乘
分析
边界条件
n = 0 或 n = 1时阶乘为零
递归条件
factorial(n) = factorial(n-1) * n
代码
int factorial(int num){
if(num == 1 || num == 0) return 1;
return factorial(num-1)*num;
}
递归算法二:Fibonacci数列
分析
边界条件
n = 0 或 n = 1时数列项值为 1
递归条件
fibonacci(n) = fibonacci(n-1) + fibonacci(n-2)
代码
int fibonacci(int n){
if(n == 0|| n == 1) return 1;
return fibonacci(n-1)+fibonacci(n-2);
}
递归算法三:汉诺塔
分析
边界条件
只有一个圆环时,只需将圆环从第一座塔移到第三座塔
递归条件
1、从第一座塔把n-1个圆环移到第二座塔,用第三座塔做辅助
2、从第一座塔把第n个圆环移到第三座塔
3、从第二座塔把n-1个圆环移到第三座塔,用第一座塔做辅助
代码
/*
@param char 原塔位置
@param char 终点塔位置
*/
void move(char from ,char to) {
cout<<"Move "<<from<<"to"<<to<<endl;
}
/*
@param int 圆环个数
@param char 原塔位置
@param char 辅助移动塔的位置
@param char 终点塔位置
*/
void hanoi(int n, char first, char second, char third) {
if(n==1)
move(first,third);
else{
//把上面n-1个圆环从first塔移动到second塔,以third塔为辅助
hanoi(n-1,first,third,second);
//把第n个圆环从first塔移动到third塔
move(first,third);
//把在second塔上的n-1个圆环移动到third塔上,以first塔为辅助
hanoi(n-1,second,first,third);
}
}
递归算法四:猴子摘桃的数量
问题描述
猴子第一天采摘了一些桃子,第二天吃了第一天的一半多一个,第三天吃了第二天的一半多一个…直到第十天就剩下一个。问:猴子第一天摘了多少桃子?
分析
边界条件
第十天剩一个桃子,即peachesNumber(10) = 1
递归条件
peachesNumber(day) = peachesNumber(day-1)/2 - 1;
转化一下
peachesNumber(day) = ( peachesNumber(day+1) + 1 ) * 2
代码
int peachesNumber(int day){
if(day == 10) return 1;
return (peachesNumber(day+1)+1)*2;
}
递归算法五:十进制转任意进制
分析
边界条件
十进制数除以要转换的进制数等于零时,可直接输出这个十进制数
递归条件
conversion(number/radix,radix); 即不断除以进制数进行递归知道触及边界条件
代码
/*
@param int 十进制数
@param int 要转换的进制
*/
void conversion(int number,int radix){
if(number/radix == 0){
cout<<number;return;
}
conversion(number/radix,radix);
cout<<number%radix;
}
递归算法六:逆序输出一个正整数
分析
边界条件
正整数除以十等于零时直接输出
递归条件
1、输出正整数取余十
2、正整数除十递归
代码
void reverseInt(int number){
if(number/10 == 0) {
cout<<number<<" ";
return;
}
cout<<number%10<<" ";
reverseInt(number/10);
}
递归算法七:正序输出一个正整数
分析
边界条件
正整数除以十等于零时直接输出
递归条件
1、正整数除十递归
2、输出正整数取余十
代码
void positiveInt(int number){
if(number/10 == 0) {
cout<<number<<" ";
return;
}
positiveInt(number/10);
cout<<number%10<<" ";
}