递归之美

题目1描述

输入一个表达式(用字符串表示),求这个表达式的值。

保证字符串中的有效字符包括[‘0’-‘9’],‘+’,‘-’, ‘*’,‘/’ ,‘(’, ‘)’,‘[’, ‘]’,‘{’ ,‘}’。且表达式一定合法。

输入描述:

输入一个算术表达式

输出描述:

得到计算结果

示例1

输入

3+2*{1+2*[-4/(8-6)+7]}

输出

25
#include <stdio.h>
#include <string.h>
#include <ctype.h>
 
int pos;
int compute(char *data)
{
    int stack[1000];
    int i, top = 0;
    int len;
    int num;
    char flag = '+';
    int rc = 0;
     
    len = strlen(data);
     
    while(pos < len){
        if(data[pos] == '{' || data[pos] == '[' || data[pos] == '('){
            pos++;
            num = compute(data);
        }
         
         
        while(pos < len && isdigit(data[pos])){
            num = num*10 + data[pos] - '0';
            pos++;
        }
        switch(flag){
            case '+':
                stack[top++] = num;
                break;
            case '-':
                stack[top++] = -num;
                break;
            case '*':
                stack[top-1] *= num;
                break;
            case '/':
                stack[top-1] /= num;
                break;
        }
        flag = data[pos];
        num = 0;
         
        if(data[pos] == '}' || data[pos] == ']' || data[pos] == ')'){
            pos++;
            break;
        }
        pos++;
    }
     
    for(i=0; i<top; i++)
    {
        rc += stack[i];
    }
    return rc;
}
 
 
int main(void)
{
    char data[1000];
     
    scanf("%s", data);
     
    int rc = compute(data);
     
    printf("%d", rc);
     
    return 0;
}

题目2描述

请计算n*m的棋盘格子(n为横向的格子数,m为竖向的格子数)沿着各自边缘线从左上角走到右下角,总共有多少种走法,要求不能走回头路,即:只能往右和往下走,不能往左和往上走。

输入描述:

每组样例输入两个正整数n和m,用空格隔开。(1≤n,m≤8)

输出描述:

每组样例输出一行结果

输入

2 2

1 2

输出

6

3

#include <iostream>

using namespace std;

int func(int m, int n) {
    if (m == 0 || n == 0) {
        return 1;
    }
    return func(m, n - 1) + func(m - 1, n);
}
int main() {
    int m, n;
    while (cin >> m >> n) {
        cout << func(m, n) << endl;
    }

    return 0;
}
原文地址:https://www.cnblogs.com/god-of-death/p/14758849.html