10代と話して驚いたこと

逆じゃないですか?

l + (r - l) // 2

にしてたらなおされたれんですけど、逆になりませんか??

バイナリーサーち
google gemini

「これオーバーフロー」の質問画像

A 回答 (2件)

バイナリサーチに使われている変数ということなら


r、lとも正の整数で l≦r  ということでいいよね?

以下説明のためr、lとも16bit整数(-32768~32767)とし、計算途中も全てすべて16bit整数とします。
とすると、 たとえば r=32000 l=16000 だとすると
mi=(r+l)//2 なら r+lを計算した時点で32767超えとなるのでアウト。
mi=l+(r-l)//2 なら、32767超えとなるタイミングは存在せず。
mi=r+(l-r)//2 は、32767超えは問題ないが、可読性に劣る。

mi=(r+l)//2は、データ数16384以下でないとマズイ、という条件がつくから、コレはダメ。  であるのに、なぜか、直された。

というのが質問の趣旨、でしょうか。


現行CPUは64bitなので、現実マズイことになることはあまりなさそうなので、
可読性重視で mi=(r+l)//2
のいうのもアリ(データ数があまり大きくない、という前提で。)と思う。
そして、ソフトが直したのは、可読性云々ではなくて
mi=l+(r-l)//2よりmi=(r+l)//2のほうが計算が速い
という理由だと思う。
で、16bit整数なら、デメリットがデカイと思うが、32bit整数以上なら
可読性重視でいいと思う。でも、直された理由は、そうじゃなくて計算速度重視ぽいので、そりゃないよ、と思う。

※なお、配列サイズ固定で宣言している場合、(r+l)//2で問題ない
 と判断して修正 という可能性がある。これはその通りなので.....
    • good
    • 0
この回答へのお礼

ありがとう

そなんですね??ありがとうございます。わかりやすかたです

お礼日時:2024/04/21 17:00

「逆」とは何がですか?



数学的には
l + (r - l) / 2 = (l+r) / 2
ですから、どちらの書き方も間違いではありません。


AIは正解を出すものではありません。
私にはelif 〜 の後の ll = 〜の式が何を意図しているのかがさっぱりわかりません。
    • good
    • 0
この回答へのお礼

助かりました

お礼日時:2024/04/21 17:00

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報

このQ&Aを見た人がよく見るQ&A