递归练习

一、汉诺塔

假设所有的盘子都在A柱,需要移动到C柱。
输入盘子的数量,输出移动的步骤。

#include<iostream>
using namespace std;

void hanoi(int n, char a, char b, char c)
{
    if(n != 1)
    {
        hanoi(n - 1, a, c, b);
        cout<<"把一个盘子从"<<a<<"移到"<<c<<endl;
        hanoi(n - 1, b, a, c);
    }
    else if(n == 1)
    {
        cout<<"把一个盘子从"<<a<<"移到"<<c<<endl;
    }
}

int main() 
{
    int n;
    char a = 'a', b = 'b', c = 'c';
    cin>>n;
    hanoi(n, a, b, c); 
    return 0;    
}

二、放苹果

把m个苹果放到n个盘子里,可以有空盘子。求有多少种算法?

例:

输入:7 3
输出:8

注:

不考虑盘子顺序,即1,5,15,1,1视作同一种放法

int apple(int m, int n)
{
    int x, emptyExist = 0;
    if( m == 1 && n == 1)
        return 1;
    else if(n > m)
    {
        return apple(m, m);
    }
    else if(m != 0 && n == 0)
    return 0;
    else if(m == 0)
    return 1;
    else if( n <= m)
    {
        return apple(m - n, n) + apple(m, n - 1);
    }
}           //在main函数里输入m和n后,输出apple(m, n)即可

三、求解理解错误的逆波兰表达式的值

写程序之前,理解错了逆波兰表达式的概念。
这一段里的逆波兰表达式的计算方法为:
输入一个待求解的逆波兰表达式input:
float input[] = {'/', '+', '/', 11, 22, 24, 20};
如上input的计算方式为 : 20 / (24 + (22 / 11))

这种解法貌似有点儿笨

思路:

思路

代码:

#include<stdio.h>
#include<math.h>

float compute(float before[], int sizebefore, float after[], int sizeafter);
float reverse(float a[], int l);
float input[] = {'/', '+', '/', 11, 22, 24, 20};
float output[] = {'+', 11, 12};

float reverse(float a[], int l)
{
    int i;
    float b[l - 2];
    if(l == 3)
    {
        switch((int)a[0])           //a[2] 运算符 a[1]
        {
            case '+':
                return a[2] * 1.0 + a[1];
                break;
            case '-':
                return a[2] * 1.0 - a[1];
                break;
            case '*':
                return a[2] * 1.0 * a[1];
                break;
            case '/':
                return a[2] * 1.0 / a[1];
                break;
        }
    }
    else
    {
        for(i = 1; i <= l - 2; i++)
        {
            b[i - 1] = a[i];        //b[] 为 a[] 除去头和尾,即下一次递归的a[]
        }
        return compute(a, l, b, l - 2);     //a[l - 2] * reverse(b[])
    }
}
float compute(float before[], int sizebefore, float after[], int sizeafter)
{
    switch((int)before[0])
    {
        case '+':
            return before[sizebefore - 1] * 1.0 + reverse(after, sizeafter);
            break;
        case '-':
            return before[sizebefore - 1] * 1.0 - reverse(after, sizeafter);
            break;
        case '*':
            return before[sizebefore - 1] * 1.0 * reverse(after, sizeafter);
            break;
        case '/':
            return before[sizebefore - 1] * 1.0 / reverse(after, sizeafter);
            break;
    }
}
int main()
{
    float toBeSolved[];
    int sizeOf;                 //自行输入逆波兰表达式,To be continued
    printf("%f", reverse(input, sizeof(input) / sizeof(input[0])));
    return 0;
}

四、真·逆波兰表达式

真·逆波兰表达式的形式示意:
表达式:* / + 12 36 + 1 3 - 15 8
含义:((12 + 36) / (1 + 3)) * (15 - 8)
结果:84

思路:
定义一个返回表达式的值的函数。
输入,并将输入作为字符串处理。
若字符串第一个字符为运算符+,-,*,/,则接下来输入的肯定是连续两个逆波兰表达式,即再调用两次此函数,且这两个函数相加减乘除。
若字符串内第一个字符为数字,则调用atof()函数将数字转换为浮点数作为返回值。
注:若第一个字符为-,可能是遇到了负数,因此需在此中情形里加入一个判断,如果字符串长度strlen() 为1,则按运算符处理,否则按数字处理。

代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

float reverse()
{
    char a[10];
    scanf("%s", a);
    switch(a[0])
    {
        case '+':   return reverse() + reverse();
        case '-':   if(strlen(a) == 1) return reverse() - reverse();
                    else return atof(a);
        case '*':   return reverse() * reverse();
        case '/':   return reverse() / reverse();
        default:    return atof(a);
    }
}

int main()
{
    float a = reverse();
    printf("%.2f", a);
    return 0;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 151,688评论 1 330
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 64,559评论 1 273
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 101,749评论 0 226
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 42,581评论 0 191
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 50,741评论 3 271
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 39,684评论 1 192
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,122评论 2 292
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 29,847评论 0 182
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 33,441评论 0 228
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 29,939评论 2 232
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,333评论 1 242
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 27,783评论 2 236
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,275评论 3 220
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,830评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,444评论 0 180
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 34,553评论 2 249
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 34,618评论 2 249

推荐阅读更多精彩内容

  • 第5章 引用类型(返回首页) 本章内容 使用对象 创建并操作数组 理解基本的JavaScript类型 使用基本类型...
    大学一百阅读 3,132评论 0 4
  • 23.01_File类递归练习(统计该文件夹大小) 需求:1,从键盘接收一个文件夹路径,统计该文件夹大小 23.0...
    苦笑男神阅读 282评论 0 0
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,050评论 18 139
  • 是啊 你有什么资格不努力 虽然这句话已经被各种心灵鸡汤的博主po了个遍 可这也打了不少人的脸 我不知道我究竟想要怎...
    忙狗夫人阅读 136评论 0 0
  • 本文参与#漫步青春#征文活动,作者:白鹏,本人承诺,文章内容为原创,且未在其他平台发布。 驻足 阳光挤开叶隙 打湿...
    书山压力大2阅读 89评论 1 2