1
6
每个人都忽视的基本问题:
显然,需要的是一组(可能是空的)值。 所以函数的伪代码 真正地 要求(不使用Java,因为这是家庭作业):
|
2
3
简单地说“它给了我错误”并不是很有帮助。什么样的错误?在运行时编译错误或未捕获的异常? 对于您的代码,有两个问题最突出:
可能还有其他问题,我刚刚写下了第一眼就跳出来的问题。 编辑:
显然
需要注意的一点是,sin函数对于a和b的一个选择可以单调地递增,而在其他间隔可以单调地递减。例如,它在[0,pi/2]上增加,在[pi/2,3*pi/2]上减少。因此,递归调用需要根据进行搜索的原始间隔进行更改。对于一个间隔math.sin(middle)<0意味着math.sin(x)<0对于[a,middle]中的所有x,但对于其他间隔,则相反。这可能就是为什么对于您正在尝试的间隔,它会陷入无限递归的原因。我认为这在另一个区间内有效,在这个区间内,罪恶实际上在减少。尝试通过[pi/2,3*pi/2]调用函数。 |
3
3
我猜您在运行时会遇到堆栈溢出错误。<和>符号颠倒。另外,您应该使用.0001而不是0来进行比较。 编辑1: 实际上,您的基本算法有问题。如果间隔中有一个以上的零会发生什么?如果罪(a)和罪(mitte)有相同的符号会发生什么?如果间隔中没有零会发生什么? 编辑2: 好吧,所以我做了这个问题,从根本上说,你的解决方案是有问题的;我会重新开始思考如何解决它。 主要的问题是间隔中可能有多个零,而您正试图找到它们中的每一个。创建返回类型double的函数只能返回一个解决方案。所以,与其创建一个返回double的函数,不如返回void,并在找到零时打印出来。 另一个提示:您应该继续搜索,直到a和b在.0001范围内。您的最终解决方案不会以任何其他方式使用.0001。(也就是说,检查是否发现零不应使用.0001公差,也不应准确使用0。想一想,当abs(a-b)小于0.0001时,你将如何真正知道你是否找到了0。 |
4
2
你把作业读到最后了吗?上面写着:
所以你不能期待
|
5
2
我猜你会遇到
你的练习说
所以,试着把这个放在方法的最前面:
|
6
1
除了其他提到的一些浮点问题外,您的算法似乎基于以下隐含假设:
我看不出这些假设的依据。当它们中的任何一个是错误的,我都不期望你的算法能工作。当a=5和b=8时,它们都是假的。 |
7
0
在哪里
|
8
0
我想是这样的-只是为了修正第一个错误 |