回答
我對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. 舍入分數值INT
- 2. 向上或向下舍入
- 3. 舍入當[INT] = [浮子] + [INT]
- 4. 矢量向上舍入或向下舍入的百分比和整數除法
- 5. Python 2.7:向下舍入而不是向上舍入
- 6. 向上舍入或向下舍入速度
- 7. 向上舍入行高
- 8. DateTime向上和向下舍入
- 9. 四捨五入向上/向下數
- 10. C#向上和向下舍入
- 11. C#正在向下舍入分部
- 12. 向下舍入Parsefloat
- 13. PHP向下舍入
- 14. 向上舍入浮點數bash
- 15. 總是向上舍入一個雙倍
- 16. 向上舍入爲圖最大
- 17. 在SQL Server中向上舍入?
- 18. Python v2.6向上舍入小數(貨幣)?
- 19. Rails 3視圖 - 向上舍入
- 20. Apache Velocity向上舍入到多個
- 21. 函數int()向負無窮(floor)或零進行舍入?
- 22. 將數字向上舍入爲int大小邊界字節數的方法
- 23. SSRS部分舍入
- 24. Python部分舍入
- 25. 區分字符串/ Int用戶輸入
- 26. numericUpdown防止四捨五入int
- 27. 變量瘋狂,舍入數(int,double等)
- 28. 大雙被四捨五入爲int - C++
- 29. 四捨五入static_cast <int>?
- 30. Python的INT浮動四捨五入
有趣的版本,但圖2.17顯示了積極操作數的無窮遞歸,所以情況並非如此。 –