パンの木を植えて

主として数学の話をするブログ

LeetCodeから学んだこと

\[ %%% 黒板太字 %%% \newcommand{\A}{\mathbb{A}} %アフィン空間 \newcommand{\C}{\mathbb{C}} %複素数 \newcommand{\F}{\mathbb{F}} %有限体 \newcommand{\N}{\mathbb{N}} %自然数 \newcommand{\Q}{\mathbb{Q}} %有理数 \newcommand{\R}{\mathbb{R}} %実数 \newcommand{\Z}{\mathbb{Z}} %整数 %%% 2項演算 %%% \newcommand{\f}[2]{ \frac{#1}{#2} } \]

LeetCodeで Easy 問題を解いた数が,上位20%に入ったみたいです.

めでたいので少し所感を書きます.


LeetCode をやる前と何が変わったかなと考えていたんですが,再帰関数の扱い にだいぶ慣れたと思います.

関数 f の実行中に f 自身を呼び出すことで,Tree をなぞるように実行させることができる……というのは慣れるまでは不思議な感じがしましたが,今ではあまり考えこまずに書くことができるようになりました.


さらに,これは今日気が付いたんですが,再帰関数は返り値が void でも構わないということも学びました.返り値がなくてもいい.

「自分自身に自分の返り値をかませる」のが再帰のメリットなのに,返ってくるものがなければ再帰の嬉しさがないんじゃないか…?って最初は思っていたんですけど,再帰関数のスコープの外に状態を管理するための変数を置いておけばいいだけですね.バカでした.

そうしておいて再帰が行われるたびにスコープ外の変数を更新してやれば,再帰関数自身に状態を持たせることなく,再帰プロセスを通した状態の更新ができます.


思えば LeetCode を始めたばっかりの頃は,連結リストの問題が出てくると毎回最初に配列に変換していたものでした.

変換後に処理を行い,再び連結リストに戻すわけです.

なんという罰当たりなコードを書くんでしょうか.いけない子ですね.

でも,再帰のテクニックをある程度理解した今では,連結リストのままで解くことができます.

木構造とか連結リストは繰り返し処理では扱いづらいので,これはおそらくLeetCode初心者の誰もが通る道なのではないでしょうか.