递归思路解决的四则运算问题,C语言
2011-06-28 17:40
726 查看
递归思路解决的四则运算问题,C语言
网上很多解决四则运算的算法都是基于栈的思想的(数据结构一书中也是使用了栈),
我想了一下,使用递归的方法解决起来很清晰的思路
首先,不论多少复杂的四则运算,都是由若干的像1+2这样的两项加一个运算符的算子组成的
所以我每次递归都传入第一项,在函数中获取符号和第二项,
在最后处理这两项的时候有不同,
高优先级的符号(乘除)将会在函数中进行计算后结果当作第一项传入下一轮的递归
低优先级的符号(加减)将会在函数中请求将第二项作为下一轮的第一项进行递归的结果作为第二项
最后碰到‘=’返回第一项,就解决问题了,
加上括号还要更加细致的分析了,贴上代码
#include <stdio.h> #include <string.h> #include <stdlib.h> // // 封装常用的判断是否为数字的判断函数,如果是返回1否则0 // int IsNum(char ch) { return (ch >= '0' && ch <= '9'); } // // 把指向Calc的INDEX放于全局变量的位置,因为在递归的过程中需要递增 // int INDEX = 0; int Calc(char sub_str[],int first) { // // 1.记录下读取到的符号 // char item = sub_str[INDEX]; char temp[10] = {0}; char temp_index = 0; // // 2.如果为终结符,返回first // if (item == '=' || item == '\0' || item == ')') { printf("2.return %d\n",first); INDEX++; return first; } // // 3.1如果为前括号, // int sub_first = 0; if (item == '(') { INDEX++; printf("3.1sub_first = Calc(%s,%d)\n",sub_str,0); sub_first = Calc(sub_str,0); return Calc(sub_str,sub_first); } // // 3.2如果为数字,读取数字作为first送入 // else if (IsNum(item)) { while (IsNum(sub_str[INDEX])) { temp[temp_index++] = sub_str[INDEX++]; } sub_first = atoi(temp); printf("3.2Calc(%s,%d)\n",sub_str,sub_first); return Calc(sub_str,sub_first); } INDEX++; // // 4.如果为前括号,把后面的内容作为second // int second = 0; if (sub_str[INDEX] == '(') { INDEX++; printf("4.second = Calc(%s,0);\n",sub_str); second = Calc(sub_str,0); } // // 5.如果为数字,把后面的数字作为second // else { while (IsNum(sub_str[INDEX])) { temp[temp_index++] = sub_str[INDEX]; INDEX++; } second = atoi(temp); } // // 判断加减乘除的函数,是程序的精华所在 // printf("5.first = %d\titem = %c\tsecond = %d\n", first,item,second); if (item == '+' ) { return first + Calc(sub_str, second); } else if (item == '-') { return first - Calc(sub_str, second); } else if (item == '*') { return Calc(sub_str, first * second); } else if (item == '/') { return Calc(sub_str, first / second); } } // // 使用递归的思路解决代括号的四则运算的问题 // int main(int argc, char *argv[]) { char str[100] = {"((1+((12+50)/2+10))-20*10)+9*(10*(18-11)-20)"}; while (1) { // // 循环输入函数,请输入规范的四则运算式子 // printf("str = %s\n", str); int answer = Calc(str,0); if(INDEX = strlen(str)) { printf("final_answer = %d\n", answer); } else { printf("算式错误,请检查语法\n"); } scanf("%s", str); INDEX = 0; } return 0; }
网上很多解决四则运算的算法都是基于栈的思想的(数据结构一书中也是使用了栈),
我想了一下,使用递归的方法解决起来很清晰的思路
首先,不论多少复杂的四则运算,都是由若干的像1+2这样的两项加一个运算符的算子组成的
所以我每次递归都传入第一项,在函数中获取符号和第二项,
在最后处理这两项的时候有不同,
高优先级的符号(乘除)将会在函数中进行计算后结果当作第一项传入下一轮的递归
低优先级的符号(加减)将会在函数中请求将第二项作为下一轮的第一项进行递归的结果作为第二项
最后碰到‘=’返回第一项,就解决问题了,
加上括号还要更加细致的分析了,贴上代码
#include <stdio.h> #include <string.h> #include <stdlib.h> // // 封装常用的判断是否为数字的判断函数,如果是返回1否则0 // int IsNum(char ch) { return (ch >= '0' && ch <= '9'); } // // 把指向Calc的INDEX放于全局变量的位置,因为在递归的过程中需要递增 // int INDEX = 0; int Calc(char sub_str[],int first) { // // 1.记录下读取到的符号 // char item = sub_str[INDEX]; char temp[10] = {0}; char temp_index = 0; // // 2.如果为终结符,返回first // if (item == '=' || item == '\0' || item == ')') { printf("2.return %d\n",first); INDEX++; return first; } // // 3.1如果为前括号, // int sub_first = 0; if (item == '(') { INDEX++; printf("3.1sub_first = Calc(%s,%d)\n",sub_str,0); sub_first = Calc(sub_str,0); return Calc(sub_str,sub_first); } // // 3.2如果为数字,读取数字作为first送入 // else if (IsNum(item)) { while (IsNum(sub_str[INDEX])) { temp[temp_index++] = sub_str[INDEX++]; } sub_first = atoi(temp); printf("3.2Calc(%s,%d)\n",sub_str,sub_first); return Calc(sub_str,sub_first); } INDEX++; // // 4.如果为前括号,把后面的内容作为second // int second = 0; if (sub_str[INDEX] == '(') { INDEX++; printf("4.second = Calc(%s,0);\n",sub_str); second = Calc(sub_str,0); } // // 5.如果为数字,把后面的数字作为second // else { while (IsNum(sub_str[INDEX])) { temp[temp_index++] = sub_str[INDEX]; INDEX++; } second = atoi(temp); } // // 判断加减乘除的函数,是程序的精华所在 // printf("5.first = %d\titem = %c\tsecond = %d\n", first,item,second); if (item == '+' ) { return first + Calc(sub_str, second); } else if (item == '-') { return first - Calc(sub_str, second); } else if (item == '*') { return Calc(sub_str, first * second); } else if (item == '/') { return Calc(sub_str, first / second); } } // // 使用递归的思路解决代括号的四则运算的问题 // int main(int argc, char *argv[]) { char str[100] = {"((1+((12+50)/2+10))-20*10)+9*(10*(18-11)-20)"}; while (1) { // // 循环输入函数,请输入规范的四则运算式子 // printf("str = %s\n", str); int answer = Calc(str,0); if(INDEX = strlen(str)) { printf("final_answer = %d\n", answer); } else { printf("算式错误,请检查语法\n"); } scanf("%s", str); INDEX = 0; } return 0; }
#include <stdio.h> #include <string.h> #include <stdlib.h> // // 封装常用的判断是否为数字的判断函数,如果是返回1否则0 // int IsNum(char ch) { return (ch >= '0' && ch <= '9'); } // // 把指向Calc的INDEX放于全局变量的位置,因为在递归的过程中需要递增 // int INDEX = 0; int Calc(char sub_str[],int first) { // // 1.记录下读取到的符号 // char item = sub_str[INDEX]; char temp[10] = {0}; char temp_index = 0; // // 2.如果为终结符,返回first // if (item == '=' || item == '\0' || item == ')') { printf("2.return %d\n",first); INDEX++; return first; } // // 3.1如果为前括号, // int sub_first = 0; if (item == '(') { INDEX++; printf("3.1sub_first = Calc(%s,%d)\n",sub_str,0); sub_first = Calc(sub_str,0); return Calc(sub_str,sub_first); } // // 3.2如果为数字,读取数字作为first送入 // else if (IsNum(item)) { while (IsNum(sub_str[INDEX])) { temp[temp_index++] = sub_str[INDEX++]; } sub_first = atoi(temp); printf("3.2Calc(%s,%d)\n",sub_str,sub_first); return Calc(sub_str,sub_first); } INDEX++; // // 4.如果为前括号,把后面的内容作为second // int second = 0; if (sub_str[INDEX] == '(') { INDEX++; printf("4.second = Calc(%s,0);\n",sub_str); second = Calc(sub_str,0); } // // 5.如果为数字,把后面的数字作为second // else { while (IsNum(sub_str[INDEX])) { temp[temp_index++] = sub_str[INDEX]; INDEX++; } second = atoi(temp); } // // 判断加减乘除的函数,是程序的精华所在 // printf("5.first = %d\titem = %c\tsecond = %d\n", first,item,second); if (item == '+' ) { return first + Calc(sub_str, second); } else if (item == '-') { return first - Calc(sub_str, second); } else if (item == '*') { return Calc(sub_str, first * second); } else if (item == '/') { return Calc(sub_str, first / second); } } // // 使用递归的思路解决代括号的四则运算的问题 // int main(int argc, char *argv[]) { char str[100] = {"((1+((12+50)/2+10))-20*10)+9*(10*(18-11)-20)"}; while (1) { // // 循环输入函数,请输入规范的四则运算式子 // printf("str = %s\n", str); int answer = Calc(str,0); if(INDEX = strlen(str)) { printf("final_answer = %d\n", answer); } else { printf("算式错误,请检查语法\n"); } scanf("%s", str); INDEX = 0; } return 0; }
#include <stdio.h> #include <string.h> #include <stdlib.h> // // 封装常用的判断是否为数字的判断函数,如果是返回1否则0 // int IsNum(char ch) { return (ch >= '0' && ch <= '9'); } // // 把指向Calc的INDEX放于全局变量的位置,因为在递归的过程中需要递增 // int INDEX = 0; int Calc(char sub_str[],int first) { // // 1.记录下读取到的符号 // char item = sub_str[INDEX]; char temp[10] = {0}; char temp_index = 0; // // 2.如果为终结符,返回first // if (item == '=' || item == '\0' || item == ')') { printf("2.return %d\n",first); INDEX++; return first; } // // 3.1如果为前括号, // int sub_first = 0; if (item == '(') { INDEX++; printf("3.1sub_first = Calc(%s,%d)\n",sub_str,0); sub_first = Calc(sub_str,0); return Calc(sub_str,sub_first); } // // 3.2如果为数字,读取数字作为first送入 // else if (IsNum(item)) { while (IsNum(sub_str[INDEX])) { temp[temp_index++] = sub_str[INDEX++]; } sub_first = atoi(temp); printf("3.2Calc(%s,%d)\n",sub_str,sub_first); return Calc(sub_str,sub_first); } INDEX++; // // 4.如果为前括号,把后面的内容作为second // int second = 0; if (sub_str[INDEX] == '(') { INDEX++; printf("4.second = Calc(%s,0);\n",sub_str); second = Calc(sub_str,0); } // // 5.如果为数字,把后面的数字作为second // else { while (IsNum(sub_str[INDEX])) { temp[temp_index++] = sub_str[INDEX]; INDEX++; } second = atoi(temp); } // // 判断加减乘除的函数,是程序的精华所在 // printf("5.first = %d\titem = %c\tsecond = %d\n", first,item,second); if (item == '+' ) { return first + Calc(sub_str, second); } else if (item == '-') { return first - Calc(sub_str, second); } else if (item == '*') { return Calc(sub_str, first * second); } else if (item == '/') { return Calc(sub_str, first / second); } } // // 使用递归的思路解决代括号的四则运算的问题 // int main(int argc, char *argv[]) { char str[100] = {"((1+((12+50)/2+10))-20*10)+9*(10*(18-11)-20)"}; while (1) { // // 循环输入函数,请输入规范的四则运算式子 // printf("str = %s\n", str); int answer = Calc(str,0); if(INDEX = strlen(str)) { printf("final_answer = %d\n", answer); } else { printf("算式错误,请检查语法\n"); } scanf("%s", str); INDEX = 0; } return 0; }
相关文章推荐
- 李洋疯狂C语言之用递归解决李白喝酒问题(二)
- boj problem 1331 思路:快排分块 按块查找 问题:全局数组时可以定义到500W的 main函数下的数组不行~ 另外c语言比c++快 TLE可以考虑C~~具体原因待解决
- C语言递归解决年龄问题
- C语言递归解决5人分鱼问题
- 用Python递归解决阿拉伯数字转为中文财务数字格式的问题(2)--打开思路的一种方法
- 李洋疯狂C语言之用递归解决李白喝酒问题(附填空题解法)
- 使用递归解决问题的一般思路
- 使用递归解决问题的一般思路
- 用递归解决问题的思路
- 蓝桥杯,关于数独的递归思路解决问题
- <C语言>用递归调用函数解决穷举n位二进制数问题
- 用栈解决四则运算问题
- 用C语言解决(hanoi)汉诺塔问题——函数的递归调用
- 用栈解决四则运算问题
- C语言 递归(回溯) 解决数独问题
- C语言递归解决分鱼问题
- C语言 递归(回溯) 解决数独问题
- 函数的递归--解决问题的底层思路
- 解决复杂问题的思路 —— 从简单到复杂
- 利用简洁的C语言代码解决跳台阶问题与约瑟夫环问题