Conversation
| return 0 | ||
| if n < 0: | ||
| x = 1.0 / x | ||
| n = -n |
| x = 1.0 / x | ||
| n = -n | ||
|
|
||
| if n % 2 == 1: |
There was a problem hiding this comment.
n % 2, n // 2についてはそれぞれn & 1, n >> 1とも書けるかもしれません。
操作の記述としては直感的ではないかもですが、一般的には整数の割り算に比べてビット演算の方がCPUにとって早いと聞いたことがあるので、一応頭の片隅に入れておくと良いかもしれません。(すみません、実際それぞれどれぐらいのクロック数が必要かとか、pythonでこう書いたときに最適化されてビット演算と同じになるのかとかは電車内にいまして調べられていません…)
There was a problem hiding this comment.
その視点はなかったですが今回のように計算用の関数の場合はそう言った観点も重要そうですね
|
|
||
| if n % 2 == 1: | ||
| return x * self.myPow(x, n-1) | ||
| return self.myPow(x*x, n//2) |
There was a problem hiding this comment.
-, //の両隣はスペースを開ける方が自然な気がしました(もしかすると関数の引数としての区切りが明確になるという点でこういう場合は開けない方が好みという方もいるのでしょうか?)
There was a problem hiding this comment.
自分はまとまっていた方が理解しやすいと思ってしまうタイプですが、一般的なのは開ける方な気はしています。。
There was a problem hiding this comment.
https://peps.python.org/pep-0008/#whitespace-in-expressions-and-statements
Python の標準的なスタイル指針の PEP8 はどちらでもといってそうですね。
スタイルは統一されていることが大事なので、あんまり局所的に正誤が決まるものであるというよりは周りを見て合わせるくらいがちょうどいいかと思います。
|
|
||
| を見ると微妙 | ||
|
|
||
| - 自分で計算するときは{x^(n//2)}^2のようにすることが多いのでこれを実装 |
|
|
||
| ```python | ||
| class Solution: | ||
| @cache |
| if n == 0: | ||
| return 1 | ||
| if n % 2 == 1: | ||
| return x * self.myPow(x, n-1) |
There was a problem hiding this comment.
二項演算子の左右には、適宜スペースを入れることをお勧めします。
参考までに、関連するスタイルガイドを共有いたします。
https://peps.python.org/pep-0008/#other-recommendations
Always surround these binary operators with a single space on either side: assignment (=), augmented assignment (+=, -= etc.), comparisons (==, <, >, !=, <=, >=, in, not in, is, is not), Booleans (and, or, not).
https://google.github.io/styleguide/pyguide.html#36-whitespace
Surround binary operators with a single space on either side for assignment (=), comparisons (==, <, >, !=, <>, <=, >=, in, not in, is, is not), and Booleans (and, or, not). Use your better judgment for the insertion of spaces around arithmetic operators (+, -, *, /, //, %, **, @).
なお、これらのスタイルガイドは唯一絶対のルールではなく、数あるガイドラインの一つに過ぎません。チームによって重視する書き方が異なる場合もあります。
そのため、ご自身の中に基準を持ちつつも、最終的にはチーム内で一般的とされる書き方に寄せていくことをお勧めいたします。
| return 1 | ||
| if n % 2 == 1: | ||
| return x * self.myPow(x, n-1) | ||
| return self.myPow(x, n // 2) * self.myPow(x, n // 2) |
There was a problem hiding this comment.
一度変数に格納してから掛けたほうがシンプルだと思います。
p = self.myPow(x, n // 2)
return p * p
問題文: https://leetcode.com/problems/powx-n/description/