関数などのルーチンが自分自身を呼び出して実行すること。
ある種の複雑な問題を解くコードをシンプルに記述できる場合があるが、再帰による入れ子の数に応じて占有するメモリが増加する上、実行速度も効率的とは言えず、非再帰的に記述できるならそうすべきである。 再帰によって簡潔に記述できる処理の例としては「ハノイの塔」と呼ばれるゲームの解法が有名。
paizaラーニングの新・Python入門編に「新・Python入門編20: 関数の引数と再帰呼び出しを学習しよう」が追加されました。新・Python入門編では、プログラミング未経験者でもPythonとの特徴や強み、標準出力やデータ型、数値演算、変数や文字列、リストやタプルなどの使い方を動画レッスンと演習課題で学べます。今回は、「新・Python入門編20: 関数の引数と再帰呼び出しを学習しよう」の内容をご紹介します。paizaラーニングについて詳しくはこちら 【目次】 関数の引数と再帰呼び出しとは 新・Python入門編に追加されたレッスンの内容 新・Python入門編20: 関数の引数と再…
#include <iostream> using namespace std; void itakogei(){ cout << "再帰関数の大川隆法です.スゥ…「"; itakogei(); cout << "」" << endl; } int main(void){ itakogei(); }
1から5までの整数を1度ずつ使って5桁の整数を作るとき、何通りの整数が作れるか? 高校数学の基本問題である。一瞬で解ける簡単な問題だ。 しかし、それを全て書き出せと言われてたらどうだろう。かなり面倒な作業になる。こういう作業はコンピュータに任せるのがいい。 そこで、ExcelのVBAを利用して作ってみようと考えた人もいるはずだ。あいにくVBAにはPythonのpermutationsのような便利な関数は用意されていない。だから、自分でコードを書かなければならない。 もちろん、順列を書き出すコードはインターネットで検索すれば簡単に見つかる。幾人ものレビューによって洗練されたコードもある。既存のア…
これは弥生 Advent Calendar 2021 の7日目の記事です。 qiita.com PosgreSQL の WITH 共通テーブル式(Common Table Expression)は一時的なテーブルを定義するもの。 サブクエリを使って SQL がネストして深くなってしまうような場合に、便利だと思う。 PostgreSQL では WITH 句で CTE を書ける。 www.postgresql.jp こんな感じで、名前をつけた式を別の式から呼ぶことができる。便利。 WITH company_names AS ( SELECT company_name AS name FROM co…
どうも!LSSです!! もう4か月も前になりますか。 【JavaScript】続・自動生成迷路 - Little Strange Software というスクリプトを書いていました。 タイトル通り、自動的に迷路を生成するスクリプトでしたが、生成して表示するだけのものでした。 で、今回はそれに「最短正解ルート」を自動的に割り出し、表示する機能をつけてみました! 自動生成迷路 最短正解ルートの割り出しアルゴリズム コード あとがき 自動生成迷路 幅: 高さ: // ax=xmax || ay=ymax?0:parseInt(mztxt.substr(ax+ay*xmax,1)); mzw=(ax,…
非同期で再帰(UWP) 自分用:メモ: 非同期で再帰(UWP)の挙動が安定しない…。 この辺か??? devlights.hatenablog.com stackoverflow.com 自分でも書いてはみたが... var buf = new BlockingCollection<IStorageItem>(); var copyDirTask = Task.Run<Task>(async () => { await this.CopyFolderAsync(s, d, buf); buf.CompleteAdding(); }); List<AbstractStorage> result1…
ふと、「再帰」のことが気になり、ChatGPTにいろいろ聞いていたところ、KotlinのWebサーバーフレームワークKtorの使い方の話に行き着きました。 Kotlinでコードを書く際は特に関数型プログラミングの知識が必須というわけではないのですが、徹底しようと思えば相当純度の高い関数型プログラミングが出来るようになっています。 Ktorというライブラリなどはその一例かも。 特に今、差し迫った必要があるわけではないのですが、少し興味があります。 プログラミングにおいて、再帰という手法が重要な理由を教えてください。コード例はRubyでお願いします。 関数型プログラミングの書籍に再帰の説明が多く記…
Option Explicit Sub Macro1()'' Macro1 Macro Dim searchText As String ' 検索文字列 Dim replaceText As String ' 置換文字列 Dim startRow As Long ' 検索/置換文字列が記載されている先頭行 startRow = 4 Dim searchColumn As Long ' 検索文字列が記載されている列 searchColumn = 2 Dim replaceColumn As Long ' 置換文字列が記載されている列 replaceColumn = 3 Dim i As Long…
2024年3月22日に『PPL 2024 非公式ふりかえり会』を開催しました。イベントでお話した内容を文字起こし形式で紹介します。こちらは後編です。 前編はこちら▼ product.st.inc 量子論理、型のエイリアス 藤村:次は『Automated Quantum Program Verification in Dynamic Quantum Logic』ですね。量子論理で形式検証するのは大変そうだし、どうするのかなと思ったんですけど、量子論理と動的論理っていうのがまずわからない。わからないものが2個接続されていて、なかなか難しかったです。まず量子論理自体が何なのかっていうのをよく理解する…
こんにちは。決済認証システム開発事業部の松浦と申します。 現在Go言語を用いたAPIサーバーの開発を担当しています。 再帰というものについての記事を書きたいと思います。 再帰という考え方はプログラミングに適用できますが、言語学・論理学・数学・計算機科学など幅広い分野で使われているようです。 休みの日などにプログラミング関連の本やwebの情報を読んだり、見たりすることが多く、再帰がどうこうという話が色々な所で出てきてなかなか理解できなかったのが、この記事を書こうと思ったきっかけになります。
今日もテストコード作成。今日は2つ目と3つ目が完成した。 今日作成したテストコードは、昨日完成させた物とかなり似ているので割と時間が掛からないで出来た。使い回せるプロシージャを使い回して、メイン処理だけ変更するだけだった。 ただ再帰呼び出しを使って処理する所で、ちょっとつまずいて時間が掛かってしまった。呼び出し先の記述でByRefにしないといけないのに、ByValにしていて苦戦してしまった。 気付かないから、ずっと処理されたテキストが元に戻ってしまう現象に悩まされていた。かなり前に再起呼び出しを勉強したから、結構忘れている状態で作っていたので仕方が無い部分もあるが。 でも気付かないで時間を食っ…
半環について Prolog のプログラムは論理式と解釈できます。論理式の全体は分配束となります。分配束は(単位元の存在などを無視すると)半環となります。このブログでは Prolog のプログラムを半環を使って調べています。分配束を使って調べても良いのですが、半環は環と同様のことが成り立つことがあって考えやすいので半環を使っています。いくつかの入力とそれに対する答えです。 半環の定義を教えてください 半環(Semiring)は、代数構造の一種であり、加法と乗法を持ち、それぞれに対して加法単位元と乗法単位元を持つ非常に基本的な構造です。以下に、半環の定義を示します。半環は、以下の条件を満たす二項演…
<< 前回 次回 >> はじめに この記事でやること 前回のおさらいと効率化アイディア 共有リスト その他の効率化ポイント マスの添え字を逆順に振る 左右反転解を省略する 実験結果 おわりに 参考文献 はじめに すっごく久しぶりの投稿です。本当はもっと早く投稿するつもりだったのですが、教授っちの指示で【卒研お勉強枠】から【卒研】を通り越して【学会発表】に飛躍したので、投稿を自粛してました。びっくり。 さて、某有名パズルゲームをZDDで解くと前回予告していたのですが、卒研やってるうちに謎に成果が発生してしまったので、2部に分けることになりました。まずは前半として、前回扱ったN-Queen Pro…
TypeScript は便利だ。型検査で値が保証されるのはとても頼もしい。 とはいえ場合によっては型検査を通すために不必要にタイプ量が増えてしまうことがある。 例えば下記のような型が 外部ライブラリによって生成される としよう。 type User = { __typename: 'user'; id: string; name: string; gender: 'male' | 'female'; department: { __typename: 'department'; id: string; name: string; }; }; いま User 型の値を生成して使いたい。ただし、と…
何故か知らないが土曜の夜に妙なキーワードがトレンド入りしていた。 何が流行ってるんだ!? pic.twitter.com/pY4uIFkSWY — 48@💙💛 (@bleu48) 2024年2月10日 プログラミングコンペが行われていた時間らしく同スキルを求めるような出題であったようである。詳しくは知らない。 せっかくの機会なので簡単に復習しておく。 Pythonには鉄板のメモ化ライブラリが存在する。 functools --- 高階関数と呼び出し可能オブジェクトの操作 — Python 3.12.2 ドキュメント from functools import cache @cache def …
こんにちは。 最近の太巻きはだんだん豪華になって太くなっていますが、切らずに無言で食べるにはもはや苦行なんじゃないかなと思います。さて、罠を踏んだので備忘録。 わかるひとはタイトル見たら「あー、あれね」ってわかりそう。 先に結論 おそらくこういうコードを書いていると思うので、 const func = () => { hoge: "fuga" }; こうしましょうというお話です。 const func = () => ({ hoge: "fuga" }); なんでこんなことになるのかをちょっと見ていきます。 関数の宣言の仕方あれこれ まずJavaScriptには関数定義の仕方がいろいろあるので…
年末は帰省していたのですが、有休含めて1/8までお休みにしたこともあり時間ができました。そこでLean 4を勉強してみることにしました。 Lean 4は以前このブログで紹介したLean 3と呼ばれる定理証明支援システムの後継システムです。 Lean 4からは関数型プログラミング言語としても使える、という触れ込みのようです。そこで今回はまず関数型プログラミング言語としてのLean 4を勉強してみました。勉強に使ったテキストは Functional Programming in Lean - Functional Programming in Lean です。このテキストを1章から4章まで読んでみ…
これは qiita.com の12/16の記事です。やばいもう16日が終わってしまう! はじめに 太古の昔、あるC++プログラマ*1がtemplateの再帰と特殊化を使ってコンパイル時に計算ができることを「発見」*2*3したその日から、C++とコンパイル時計算は分かちがたく結びついています。 言語機能を本来意図されていなかった方法で活用する曲芸的な技巧だったコンパイル時計算は、その強力さを買われコミュニティを席巻し、C++11での constexpr の導入によりある意味で公式に認められたものとなりました。 導入当初は return 文一つだけしか持てなかった constexpr 関数は、それ…
satob.hatenablog.com このようなスキルレベルの指標を設けたとしよう。では、まったくの素人から、ある仕事に最低限求められるスキルレベル、たとえばレベル13~15あたりまで教育するにはどれくらいの時間が必要なのだろうか? 自分のエピソードとしては、高校一年生のときの部活動が思いだされる。授業が終わったあと、だいたい16時から17時くらいまでの1時間、三年生が先生役になって一年生にC言語の本(そのとき使っていたのは「独習C」)の内容を教えていく。この活動は一学期の終わりまで続くので、だいたい3ヶ月半程度行われる。それだけの期間で、新入部員の多く(体感だけど7~8割かな)はCで再帰…
こんにちは! HapInSアドベントカレンダー2023、8日目を担当するh_shimakawaです。 今回も引き続きラムダ計算を続けていきます。 はじめに 難易度 目標 用意するもの ひき算の作成準備 PAIR と LEFT、RIGHT の実装 SLIDE DEC の定義 ひき算 わり算の準備 LE 無名再帰関数 Z コンビネータ FIX コンビネータ MOD(割り算の余り)の定義 DIVの定義 さあ展開しよう! 今回はここまで はじめに ラムダ計算第1回記事では、真偽値と数値、たし算とかけ算を定義しました。 今回は引き算と割り算の定義を行います。 ひき算とわり算の実装には、思ったよりたくさん…
はじめに 例えばRaw String Literal(もしくはT4の実行時テンプレート)を利用して、.csの生成をしようとします。 using System.Text; namespace SampleConsole { internal class Program { public static void Main() { // C#11より登場した生文字列リテラル (T4の実行時テンプレートの移行先としてしばしば利用される) // 開始の「""" (3個以上の ")」の後ろには改行必須, 1行目のインデントを基準にしてそれよりも前の空白文字は無視 // 先頭の「$」の数によって補完する際「…