用于四则计算的递归函数C语言,递归思路解决的四则运算问题,C语言

递归思路解决的四则运算问题,C语言

网上很多解决四则运算的算法都是基于栈的思想的(数据结构一书中也是使用了栈),

我想了一下,使用递归的方法解决起来很清晰的思路

首先,不论多少复杂的四则运算,都是由若干的像1+2这样的两项加一个运算符的算子组成的

所以我每次递归都传入第一项,在函数中获取符号和第二项,

在最后处理这两项的时候有不同,

高优先级的符号(乘除)将会在函数中进行计算后结果当作第一项传入下一轮的递归

低优先级的符号(加减)将会在函数中请求将第二项作为下一轮的第一项进行递归的结果作为第二项

最后碰到‘=’返回第一项,就解决问题了,

加上括号还要更加细致的分析了,贴上代码

#include

#include

#include

//

// 封装常用的判断是否为数字的判断函数,如果是返回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

#include

#include

//

// 封装常用的判断是否为数字的判断函数,如果是返回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

;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值