递归算法例子
来源:互联网 发布:长城软件纳税服务电话 编辑:程序博客网 时间:2024/06/07 23:44
1.一个人赶着鸭子去每个村庄卖,每经过一个村子卖去所赶鸭子的一半又一只。这样他经过了七个村子后还剩两只鸭子,问他出发时共赶多少只鸭子?经过每个村子卖出多少只鸭子?
由题意可知,第七天后该人只有2只鸭子,记每天的鸭子数量为num,则之前每天的鸭子总数为当天后一天的(num+1)*2只,当天卖掉的鸭子个数为(num/2)+1只
算法步骤:
1) 令num等于2,n等于7;
2) 计算前一天的总鸭子数量num = (num + 1) * 2;
3) 计算并输出第n天卖掉的鸭子数量;
4) 将n减去1,判断n是否大于0,若是,则输出总鸭子数量num,否则,递归调用函数继续进行计算。
2.角谷定理。输入一个自然数,若为偶数,则把它除以2,若为奇数,则把它乘以3加1。经过如此有限次运算后,总可以得到自然数值1。求经过多少次可得到自然数1。
如:输入22,
输出 22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1
STEP=16
算法步骤:
1) 定义计数器counter = 0输入一个自然数字n;
2) 判断n是否为偶数,若是,则n=n/2,否则,n=n*3+1,令counter自加1;
3) 判断n是否等于1,若是,则输出counter,否则,递归调用函数继续进行计算。
3.电话号码对应的字符组合:在电话或者手机上,一个数字如2对应着字母ABC,7对应着PQRS。那么数字串27所对应的字符的可能组合就有3*4=12种(如AP,BR等)。现在输入一个3到11位长的电话号码,请打印出这个电话号码所对应的字符的所有可能组合和组合数。
算法步骤:
1) 输入一个数字串存入字符串
2) 判断该字符串长度是否在3到11区间,若不在范围内,则重新输入,否则,进行下一步
3) 将字符串中的每个字符转换为数字
4)
运行结果:C_Num_Char.jpg
4.日本著名数学游戏专家中村义作教授提出这样一个问题:父亲将2520个桔子分给六个儿子。分完 后父亲说:“老大将分给你的桔子的1/8给老二;老二拿到后连同原先的桔子分1/7给老三;老三拿到后连同原先的桔子分1/6给老四;老四拿到后连同原先的桔子分1/5给老五;老五拿到后连同原先的桔子分1/4给老六;老六拿到后连同原先的桔子分1/3给老大”。结果大家手中的桔子正好一样多。问六兄弟原来手中各有多少桔子?
由题意可知,6兄弟最后得到的橘子个数为420个,老六给老大的橘子数为210个,老大原来有橘子(420-210)/7*8=240个,老n给老n-1的橘子为原来有的1/(9-n).
算法步骤:
1) n = 0,输出老n+1原来有的橘子个数
2) 若n不为0,则老n+1给下一个兄弟的橘子个数为老n+1原来的橘子个数+老n+1的到的橘子个数然后再乘以1/(8-n),若n为0,则老n+1即老大给老二的橘子个数为30个
3) 计算老n+2原来拥有的橘子个数为420*(7-k)/(6-k)再减去给下一个兄弟的橘子个数
4) 进行递归调用,判断是否满足条件
由题意可知,第七天后该人只有2只鸭子,记每天的鸭子数量为num,则之前每天的鸭子总数为当天后一天的(num+1)*2只,当天卖掉的鸭子个数为(num/2)+1只
算法步骤:
1) 令num等于2,n等于7;
2) 计算前一天的总鸭子数量num = (num + 1) * 2;
3) 计算并输出第n天卖掉的鸭子数量;
4) 将n减去1,判断n是否大于0,若是,则输出总鸭子数量num,否则,递归调用函数继续进行计算。
算法实现:
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////文件名 : Duck_Sale.cpp//创建者 : EL_Gou//创建日期 : 2017.05.12//开发环境 : Visual Studio 2017//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////#include <iostream>using namespace std;class C_Duck_Sale {public:int sale(int num,int counter);private:};int C_Duck_Sale::sale(int num,int counter){num = (num + 1) * 2; //计算num值cout << "第" << counter << "个村子卖出" << num/2-1 << "个鸭子"<< endl;counter--; //计数器减一//递归停止条件if (counter > 0){sale(num,counter); //递归调用}//输出总鸭子数字else{cout << "鸭子总数为" << num << endl;}return 0;}int main(){C_Duck_Sale DS;DS.sale(2, 7);return 0;}
运行结果:
2.角谷定理。输入一个自然数,若为偶数,则把它除以2,若为奇数,则把它乘以3加1。经过如此有限次运算后,总可以得到自然数值1。求经过多少次可得到自然数1。
如:输入22,
输出 22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1
STEP=16
算法步骤:
1) 定义计数器counter = 0输入一个自然数字n;
2) 判断n是否为偶数,若是,则n=n/2,否则,n=n*3+1,令counter自加1;
3) 判断n是否等于1,若是,则输出counter,否则,递归调用函数继续进行计算。
算法实现:
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////文件名 : Jiaogu.cpp//创建者 : EL_Gou//创建日期 : 2017.05.12//开发环境 : Visual Studio 2017//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////#include <iostream>using namespace std;class Jiaogu {public:int input(); //输入函数int computing(int counter);private:int num;};int Jiaogu::input(){cout << "请输入一个自然数:"; cin >> num; //输入一个自然数字cout << num << " ";return 0;}int Jiaogu::computing(int counter){//判断当前数字是否为1,是则输出计算次数if (num == 1){cout << endl;cout << "Step is " << counter << endl;}//当前数字不等于1else{//计算次数加1counter++;//若为偶数,则除以2if (num % 2 == 0){num = num / 2;}//若为奇数,则乘以3后再加1else{num = num * 3 + 1;}//输出当前计算结果cout << num << " ";//递归调用computing(counter);}return 0;}int main(){Jiaogu JG;JG.input();JG.computing(1);return 0;}
运行结果:
3.电话号码对应的字符组合:在电话或者手机上,一个数字如2对应着字母ABC,7对应着PQRS。那么数字串27所对应的字符的可能组合就有3*4=12种(如AP,BR等)。现在输入一个3到11位长的电话号码,请打印出这个电话号码所对应的字符的所有可能组合和组合数。
算法步骤:
1) 输入一个数字串存入字符串
2) 判断该字符串长度是否在3到11区间,若不在范围内,则重新输入,否则,进行下一步
3) 将字符串中的每个字符转换为数字
4)
算法实现:
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////文件名 : Num_Char.cpp//创建者 : EL_Gou//创建日期 : 2017.05.12//开发环境 : Visual Studio 2017//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////#include <iostream>#include <string>using namespace std;class C_Num_Char {public:C_Num_Char();int input(); //输入函数int change(); //字符串转换函数int reserve(int i, int j); //输出函数private:string num; //存储数字串string strmp;int numb[11]; //存储由字符串转换的数字char str[10][4]; //存储对应字符int num_signal; //数字个数记录};C_Num_Char::C_Num_Char(){str[0][0] = '_'; str[0][1] = '_'; str[0][2] = '_'; str[0][3] = '_';str[1][0] = '_'; str[1][1] = '_'; str[1][2] = '_'; str[1][3] = '_';str[2][0] = 'A'; str[2][1] = 'B'; str[2][2] = 'C'; str[2][3] = '_';str[3][0] = 'D'; str[3][1] = 'E'; str[3][2] = 'F'; str[3][3] = '_';str[4][0] = 'G'; str[4][1] = 'H'; str[4][2] = 'I'; str[4][3] = '_';str[5][0] = 'J'; str[5][1] = 'K'; str[5][2] = 'L'; str[5][3] = '_';str[6][0] = 'M'; str[6][1] = 'N'; str[6][2] = 'O'; str[6][3] = '_';str[7][0] = 'P'; str[7][1] = 'Q'; str[7][2] = 'R'; str[7][3] = 'S';str[8][0] = 'T'; str[8][1] = 'U'; str[8][2] = 'V'; str[8][3] = '_';str[9][0] = 'W'; str[9][1] = 'X'; str[9][2] = 'Y'; str[9][3] = 'Z';}//输入函数int C_Num_Char::input(){bool signal = true;for (; signal;){cout << "请输入数字串(3~11位):" << endl;cin >> num;if (num.length() >= 3 && num.length() <= 11){signal = false;}}num_signal = num.length();return 0;}//字符串转换函数int C_Num_Char::change(){for (int i = 0; i < num_signal; i++){if (num[i] == '0'){numb[i] = 0;}else if (num[i] == '1'){numb[i] = 1;}else if (num[i] == '2'){numb[i] = 2;}else if (num[i] == '3'){numb[i] = 3;}else if (num[i] == '4'){numb[i] = 4;}else if (num[i] == '5'){numb[i] = 5;}else if (num[i] == '6'){numb[i] = 6;}else if (num[i] == '7'){numb[i] = 7;}else if (num[i] == '8'){numb[i] = 8;}else if (num[i] == '9'){numb[i] = 9;}}return 0;}//输出函数int C_Num_Char::reserve(int i, int j){return 0;}int main(){C_Num_Char NC;NC.input();NC.change();NC.reserve(0, 0);return 0;}
运行结果:C_Num_Char.jpg
4.日本著名数学游戏专家中村义作教授提出这样一个问题:父亲将2520个桔子分给六个儿子。分完 后父亲说:“老大将分给你的桔子的1/8给老二;老二拿到后连同原先的桔子分1/7给老三;老三拿到后连同原先的桔子分1/6给老四;老四拿到后连同原先的桔子分1/5给老五;老五拿到后连同原先的桔子分1/4给老六;老六拿到后连同原先的桔子分1/3给老大”。结果大家手中的桔子正好一样多。问六兄弟原来手中各有多少桔子?
由题意可知,6兄弟最后得到的橘子个数为420个,老六给老大的橘子数为210个,老大原来有橘子(420-210)/7*8=240个,老n给老n-1的橘子为原来有的1/(9-n).
算法步骤:
1) n = 0,输出老n+1原来有的橘子个数
2) 若n不为0,则老n+1给下一个兄弟的橘子个数为老n+1原来的橘子个数+老n+1的到的橘子个数然后再乘以1/(8-n),若n为0,则老n+1即老大给老二的橘子个数为30个
3) 计算老n+2原来拥有的橘子个数为420*(7-k)/(6-k)再减去给下一个兄弟的橘子个数
4) 进行递归调用,判断是否满足条件
算法实现:
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////文件名 : Orange.cpp//创建者 : EL_Gou//创建日期 : 2017.05.12//开发环境 : Visual Studio 2017//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////#include <iostream>using namespace std;class C_Orange {public:int reserve(int num, int j, int k);private:};int C_Orange::reserve(int num, int j, int k){if (k >= 6){return 0;}//输出原来有的橘子个数cout << "老" << k+1 << "原来有橘子" << num << "个" << endl;//计算给下一个兄弟的橘子个数if (k == 0){ j = num / (8 - k);}else{j = (num + j) / (8 - k);}//计算下一个兄弟原来有的橘子个数num = 420 * (7 - k) / (6 - k) - j;k++;//递归调用reserve(num, j, k);return 0;}int main(){C_Orange Or;Or.reserve(240, 210, 0);return 0;}
运行结果:
0 0
- 算法例子-递归算法
- 递归算法例子
- 递归算法小例子
- 递归算法-小例子
- 递归算法例子
- 递归算法小例子
- 递归算法例子
- 递归算法例子
- 递归算法的一个例子
- 运用递归算法的例子
- 递归算法的一个例子
- 【算法练习】递归算法的例子
- Java递归算法的小例子
- 典型递归算法例子-------Python实现
- 算法基础_递归的例子
- 算法-递归分治(经典例子)
- 算法:递归总结(2)例子
- 递归算法及经典例子实现
- Java面向对象编程(常用基础)
- 【bzoj1013】[JSOI2008]球形空间产生器sphere
- OpenSSL Cookbook 3——证书注册请求(CSR)
- 暴力搜索(HDU 5305,Friends)
- LeetCode 173 Binary Search Tree Iterator
- 递归算法例子
- 在ubuntu14.04上安装cuda deb文件
- SSD论文阅读
- spark常用RDD算子 汇总(java和scala版本)
- 接口测试的两种方法
- 搜索和信息的作用——条件熵
- UITableView手风琴效果开发总结
- MySQL修改root密码的4种方法
- 特长生模拟——楼层