こんにちわ。Daizo です。

 

なんか、問題40のロジックが浮かばないので、Gauche で前の問題を解いてましたループ処理がどうしてもわかりません。なので、ループ処理をしないやり方とか聞いてやるのですが、それはそれで、よくわからないんだよね。

その時によく出るのが、lambda なんだよね。

使い捨て関数ってことなんだけど、書き方とか、使い方とかわからないんだよね。

これが出来るようになれば、数行渡って書いていたようなことも、1行程度で終わるんだよね。

便利なのはわかるんだけど、理解して使えるようになるのは、なかなか難しい。

例えば、

;; データリストの作成

(define num-lst 
  (filter-map digit->integer (string->list num-str)))
;; 計算関数の作成
(define (calc13 i)
   (fold * 1 (take (drop num-lst i) 13)))
;; ポジションリストの作成
(define pozi (iota (- (length num-lst) 13)))
;; ポジションリストに従って、順番に計算
(define keisan
  (map calc13 pozi))

こんな感じのコードがあるんだけど、lambda を使うと、

(define num-lst 
  (filter-map digit->integer (string->list num-str)))


(define keisan
  (map (lambda (i)
         (fold * 1 (take (drop num-lst i) 13 )))
       (iota (- (length num-lst) 13))))

 

と、これぐらいで終わるんだよね。

出来るようになりたいんだけど、なかなか理解が難しくてね。

少しづつ、勉強してわかるようになりたいです。