回答
我对parC一无所知,但就C而言,你是对的:正值的整数除法被定义为截断小数部分,即舍入为零。
但是,代码中存在另一个错误:如果数组太长,则中点可能计算错误。
准确地说,如果初始to
是大2或大于最大值的可表示的一半在int
类型(INT_MAX
),然后递归调用中的一个将得到fr, to
值都大于(INT_MAX/2)和表达式(to+fr)
将导致算术溢出。 (to+fr)/2
的结果将小于fr/2
。
为避免这种情况,推荐使用如fr + (to - fr)/2
这样的表达式,而不是(to + fr)/2
。
编辑
也有描述错误!查看图片:
(4,5)→(4,5)递归发生一个级别早于作者指出,这样一个子树不应该实际出现在图中。另外,如果程序卡在红色箭头循环中,则(6,5)递归永远不会发生 - 该进程将永远不会到达该分支。
有趣的是,作者显然忽略了另一个循环出现在他们的图画中;
递归(1,2)→(1,2)甚至早于上述这两个出现:
作为边注,我无法想象他们是如何获得的划分的两种不同的结果(4,5)→(4,5)+(6,5)和(4,5)→(4,5)+(5,5)
(见绿框)。可能他们是如此专注于强迫思考,忽略了关于问题所有其他方面的任何推理。
基于这个例子,我建议把这本书放在垃圾桶里。
你说得对,C中正操作数的整数除法总是四舍五入至分区的楼层,查询this question了解更多细节。我对parC不熟悉,但据说它是full C++ language以及来自其他语言的附加内容,所以描述的任务似乎不正确。
如果还有问题,您总是有机会直接检查任务:为parC设置environment,执行rsum()
并执行rsum(A, 1, 5)
。
您可能正在阅读的文字大于18年。 在旧版本的C标准中,负操作数的除法可以以实现定义的方式进行四舍五入:向下或向上。这意味着-3/2
可能会给你-1
或-2
取决于编译器。
这被认为是该语言的设计缺陷,并已通过C99标准进行了修正。如今,无论编译器如何,C总是使用“截至零”。
- 1. 向上或向下舍入
- 2. 舍入当[INT] = [浮子] + [INT]
- 3. Python 2.7:向下舍入而不是向上舍入
- 4. 向上舍入或向下舍入速度
- 5. DateTime向上和向下舍入
- 6. C#正在向下舍入分部
- 7. PHP向下舍入
- 8. 向上舍入为图最大
- 9. Apache Velocity向上舍入到多个
- 10. 向上舍入浮点数bash
- 11. 在SQL Server中向上舍入?
- 12. Python v2.6向上舍入小数(货币)?
- 13. 将数字向上舍入为int大小边界字节数的方法
- 14. Python部分舍入
- 15. 区分字符串/ Int用户输入
- 16. 四舍五入static_cast <int>?
- 17. Python的INT浮动四舍五入
- 18. 舍入一个值到下一个int
- 19. 大双被四舍五入为int - C++
- 20. numericUpdown防止四舍五入int
- 21. 四舍五入浮动为int
- 22. 在swift中向下舍入
- 23. 向下舍入整数值
- 24. 区分int和double
- 25. 向下舍入分钟精确到10分钟
- 26. 转换一个长双用向上(或向下)四舍五入
- 27. 向上或向下舍入为最接近的20
- 28. 在C中向上或向下舍入值#
- 29. 仅使用数学函数向上/向下舍入?
- 30. Excel中 - 舍入日期和时间 - 向上或向下小时
有趣的版本,但图2.17显示了积极操作数的无穷递归,所以情况并非如此。 –