質問するログイン新規登録
プログラミング教育

プログラミング教育は、子どもから社会人までを対象にしたプログラミング学習支援、教材紹介、教え方の工夫などに関する投稿に使用されます。

意見交換

4回答

526閲覧

入門者に教えるつまづきやすいプログラミング入門。

turnberry0712

総合スコア9

プログラミング教育

プログラミング教育は、子どもから社会人までを対象にしたプログラミング学習支援、教材紹介、教え方の工夫などに関する投稿に使用されます。

0グッド

0クリップ

投稿2025/06/29 23:45

編集2025/06/30 01:16

0

0

背景、状況

12歳、学生です。
現在Kotlinを初め、今までは別にC#を使っていました。
私の現状ですがC#ではラムダ式が読めず、KotlinやC#でもラムダ式を使わずコードを書きました。
三か月後に読めるコードを書いているか試してみております。まだ結果はでていません。
なので、その間に知識や技術などを皆様に教えてもらいたいです。

テーマ、知りたいこと

すでにつまづいておりますが、僕の場合は将来的にはラムダ式を理解すること。
あとは、皆様が感じるプログラミングで転んでしまった事、実際にあったつまづいた部分を教えてください。
その部分を気を付けつつ、皆様の後を追いかけたいと思っております。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

回答4

#1

meg_

総合スコア10995

投稿2025/06/30 11:51

皆様が感じるプログラミングで転んでしまった事、実際にあったつまづいた部分を教えてください。

そうですねぇ。無限ループを作ってしまったり、他で既に使用している変数を使ってしまったりでしょうか(ループ処理で使う 変数 i とか)。あとは配列使えば良いのにループ処理にしてしまってものすごく処理速度が遅くなってしまったりですね。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

#2

cametan

総合スコア92

投稿2025/06/30 14:28

編集2025/06/30 15:08

別にラムダ式って難しくはないんだけどねぇ・・・・・・。
だから問題としては「とある言語が採用してる構文」が読みやすいか否か、しかねぇんだよな。
あと、元々ラムダ式ってのは、数学の一分野から出てきたんで、プログラミング言語みたいに「型」がない。
よって、C#みたいな静的型付け言語の場合、記述情報が多すぎて「見づらい」って事はあり得ると思うよ。

いきなり余談だけど、ラムダ式って元々、アロンゾ・チャーチって人が考え出したのね。
で、話によると、彼が考え出した関数、ラムダ式ってのは元々キャレット(^)を使って表現したかったらしい。
つまりこうだ。

^x

本当はxの上に帽子のようにキャレットを乗せたかったらしいんだけど、まぁ、最初にこう書いてみた、と。
後にこれが

λx

となる。ギリシャ文字のλ(ラムダ)をキャレットの代わりに使ってから「ラムダ式」と呼ばれるようになったわけ。
めでたくラムダ式の登場、だ。

最初にラムダ式を導入した言語はLispって言語だ。
例えば引数xとyを足したい、って場合はこう書く。

Lisp

1(lambda (x y) (+ x y))

Lispは前置記法なんで足し算を+ x yと表記するんだけど、それはさておき。
直接Lispの影響を受けた、あるいはかなり強い影響下にある言語だとこのlambdaって表現をそのまま導入してるんだ。

Python

1lambda x, y: x + y

Ruby

1lambda {|x, y| x + y}

とかな。
ところが、最初に見た通り、「関数として見た場合には意味がある」んだけど、一方、ラムダ(λ)と言う表記自体には全く意味がないんだ。
特にプログラミング言語だとlambdaと言う表記は長すぎる。
よって、基本的に、後発の言語でラムダ式を持つ言語は「如何にしてlambdaと言う伝統的表記法を抹殺するか」ってのがある種デザインの主題になるわけ。

JavaScript

1(x, y) => x + y;

当然、Kotlinもそういう観点には立つ。

Kotlin

1{x: Int, y: Int -> x + y}

一方、Lisp、Python、Ruby、JavaScriptは動的型付け言語だ。言い換えると明示的に型を指定しなくていい。
反面、Kotlinは変数の型を明示しないとならない。よって情報量が多くなり、記述量が増える
多分その辺がKotlinのラムダ式の「読みづらさ」の一旦を担ってるんじゃないか。

ここでちと、1 + 2を考えよう。
いや、僕はKotlinを使うのはホント初めてなんだけど、フツーに考えれば、1 + 2はKotlinインタプリタでも次のように記述すれば簡単に書ける事が分かる。

Kotlin

1>>> 1 + 2 2res0: kotlin.Int = 3

しかしながら、明らかに無駄ではあるんだけど、Kotlinでは次のようにして記述可能だ。

Kotlin

1>>> {x: Int, y: Int -> x + y}(1, 2) 2res1: kotlin.Int = 3

「こう書くのが可能だ」と言う事を肝に銘じよう。
これは何も突飛な書き方ではなく、関数の実行形式、つまり関数(引数0, 引数1, ....)と言う形式に従ってる事を把握しよう。
つまり、ラムダ式は「関数と言うデータ形式を生成している。これを「関数はファーストクラスオブジェクトである」と表現する。
また、オブジェクト指向に慣れてる人向けには、ラムダ式は「関数型」と言うオブジェクトを生成するコンストラクタだと言った方が分かりやすいかもしんない。

いずれにせよ、ラムダ式自体についてはこれが全てだ。
だから問題は、ラムダ式を多用する形式、高階関数の使い方がよく分かってないって事の方がデカいんじゃないか。
高階関数は大雑把に言うと次の2つの形式の関数を指す。

  • 関数を引数に取る関数
  • 関数を返す関数

例えば「関数を引数に取る関数」の場合、ラムダ式を引数に取れる、って事だ。
逆に、「関数を返す関数」だとラムダ式を返り値として使う事が出来る。
後者では、有名な問題としてはポール・グレアムって人が出したアキュムレータの問題がある。Kotlinでは次のように書くだろう。

Kotlin

1fun foo(n: Int): (Int) -> Int { 2 var m: Int = n 3 return {i: Int -> m += i 4 m} 5}

ただ、こういう風に高階関数を「自作する」前に、まずは言語組み込みの高階関数を使う事に慣れよう。
Kotlin組み込みの高階関数を使う練習をする、って事は必然的にラムダ式の書き方を学ぶ、っちゅーこっちゃ。

とは言っても基本的には、代表的な高階関数ってKotlinだと3つくらいしかないんだ。

  1. フィルタリング: filter/filterNot
  2. マッピング: map
  3. 畳み込み: reduce

まずはこれらを練習しよう。

三か月後に読めるコードを書いているか試してみております。

読めるかどうか、ってのは「書く練習が伴って」初めてハッキリするんだよ。
日本語だろうと英語だろうと、「書かないと」読解力は上がらない。「読んでるだけじゃダメ」なんだ。国語でも作文があるのは、日本語の読解力に密接な関係があるから、だ。「ある言い回し」は使う練習をしないと自在に書けるようにはならないし、読めるようにならない。
上の例だとフィルタリングは簡単だろう。mapreduceはリスト相手の繰り返し処理強力な代替手段だ。mapはリストの各要素に同一の計算を施し、reduceはリストの各要素に計算を施しつつ単一の値(データ)を得る。
この2つを練習しまくろう。特に、一般的には、reduceが苦手な人が多いんだけど、これを使いこなせれば見える世界が変わる。
と言うわけで、3ヶ月くらいmapreduceを練習しまくる事をオススメする。最近のモダンな言語だとこれら2つを搭載している言語が多いんで、練習問題はアッチコッチで見つかると思うよ。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

#3

turnberry0712

総合スコア9

投稿2025/07/01 00:06

#2 いただいた言葉に、何度も読み返しては励まされました。こんなにも私のことを想って書いてくださったんだと思うと、心が温かくなって、また前を向く力になりました。本当にありがとうございます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

#4

fana

総合スコア12236

投稿2025/07/01 02:57

皆様が感じるプログラミングで転んでしまった事、実際にあったつまづいた部分を教えてください。

多分,求めている話とは方向性が違うだろうけど……
(うっかり自身の頭の悪さを忘れて)延々と考えすぎて進まなくなる→結果としてやらなくなる ,みたいなつまづき方(?)でわりと失敗しています.

(個人的な趣味なのであれば)プログラムのコードなんてものは後から好きなだけ書き換えることができる(なんなら最初から作り直したって良い).その程度の存在でしかない.書いたコードに過度に縛られる必要は無い.
……ハズなんだけど,何でかなぁ.何故かうっかり「事前に」(何かを)あーだこーだと頑張ろうとしてしまうんだな.
(まぁ実際にそれで頑張れるのならそれでもいいんだけど)

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

この意見交換はまだ受付中です。

会員登録して回答してみよう

アカウントをお持ちの方は

関連した質問