5.4 KiB
5.4 KiB
title | author | date | url | wordtwit_post_info | categories | ||
---|---|---|---|---|---|---|---|
ソフト開発の過去問で出てきた再帰をGaucheで書く | kazu634 | 2008-09-06 | /2008/09/06/_1098/ |
|
|
ソフトウェア開発者試験ででてきた再帰を使った関数をGaucheで書いてみた。元の関数をCで書くとこんな感じになる:
/* ======================= */ /* === Include library === */ /* ======================= */ #include <stdio.h> /* ==================== */ /* === Main Routine === */ /* ==================== */ void prnt_digit(int n) { if ( == n){ return; } printf("%d", n); prnt_digit(n - 1); printf("%d", n); } int main(int argc, char *argv[]) { prnt_digit(5); printf("\n"); return ; }
これをgaucheで書いてみる:
;; lambdaを使わないバージョン (define (proc n) (define (tmp_proc temp) (print n) (proc (- n 1)) (print n)) (if (= n ) n (tmp_proc (- n 1)))) ;; がんばってlambda使ってみたバージョン (define (proc_1 n) (if (= n ) n ((lambda (temp) (print n) (proc_1 (- n 1)) (print n)) (- n 1))))
lambdaは手続きを返すんだから「(」を二重に重ねないと引数をlambdaの無名関数に渡すことができないわけですね。なるほど。
追記:
condは暗黙でbeginが省略されていると解釈される。ifはそうじゃない。だから今回の場合は
(define (proc_2 n) (if (= n ) n (begin (print n) (proc_1 (- n 1)) (print n))))
こうでもいいわけか。