2017-08-19 93 views
2

我正在试图实现一个用于平衡给定数学方程式的括号作为字符串的函数。它应该改变字符串,而不仅仅是检查它是否平衡。用于平衡括号的函数

因为数学方程可以包含三角函数,所以我想在这样的函数后面添加radians(),因为在Python中,三角函数将输入看作弧度,而我需要度数。因此tan(65)变成tan(radians(65))
cos(65) + sin(35)成为cos(radians(65)) + sin(radians(35))
cos((30 - 10) * 2)成为cos(radians((30 - 10) * 2))

到目前为止,我所使用replace()完成与sin(radians(更换cos(cos(radians(sin(,同样的事情也适用于所有的休息三角函数。但问题是,字符串(这是一个数学方程)变成了括号 - 不平衡。

如何编写函数来解决这个问题?

回答

1

下面是在适当位置插入radians(并保持括号平衡的算法的概要。如果事先确实使括号平衡,并且在字符串文字中没有不平衡的括号(如len("abc(d")),这将起作用。但是,这看起来并不太合理。

不只是使用replace()。而应使用find()来查找cos(或其他trig函数的用法。将计数器设置为零。然后在右括号[(cos(]之后立即扫描字符串。当你遇到左括号时,将计数器加1;当你遇到右括号时,将计数器减1。当你的计数器达到-1时,你已经发现你的trig函数的右括号。在该位置插入新的右括号,然后在trig函数后面插入您的radians(

继续此操作,直到处理完字符串中的所有trig函数。

+0

这种方法存在一个问题:'cos(0)'是有效的,但没有被检测到('cos'和'(')之间有一个空格,可能需要一个正则表达式。 – jp48

+0

@ jp48:我想过但是OP没有在他尝试的算法中考虑这种可能性,我假设这个字符串已经以某种方式预处理以消除这种可能性,或者他正在用cos(弧度)或者其他的。也许我应该在我的答案中包含这些细节,但是我决定放弃这些细节并将我的答案称为“算法的概要”。我正在努力在答案中提供适当的细节,并且有时会出现超调或欠调 –

+0

@ jp48:我对正则表达式有一点了解,并且我不知道如何找到函数和它的成对的右括号,怎么做呢?这将是值得一个完整的答案。 –

2

您可以cosdeg替代cos和定义:

def cosdeg(x): 
    return cos(radians(x)) 

或(拉姆达版):

cosdeg = lambda x : cos(radians(x)) 

而且在与其他三角函数类似的方式。

+0

我喜欢这个答案,因为它显示了比OP已经认为理所当然的解决方案更好的方式。 – trincot

+0

非常好的答案。但是,在我的程序中,输入由'eval()'函数评估。为了时间和用户友好性,我无法定义一个新功能。 –