递归算法例子

来源:互联网 发布:长城软件纳税服务电话 编辑:程序博客网 时间: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,否则,递归调用函数继续进行计算。

    算法实现:

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////文件名 : 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
原创粉丝点击