--- title: ソフト開発の過去問で出てきた再帰をGaucheで書く author: kazu634 date: 2008-09-06 url: /2008/09/06/_1098/ wordtwit_post_info: - 'O:8:"stdClass":13:{s:6:"manual";b:0;s:11:"tweet_times";i:1;s:5:"delay";i:0;s:7:"enabled";i:1;s:10:"separation";s:2:"60";s:7:"version";s:3:"3.7";s:14:"tweet_template";b:0;s:6:"status";i:2;s:6:"result";a:0:{}s:13:"tweet_counter";i:2;s:13:"tweet_log_ids";a:1:{i:0;i:4259;}s:9:"hash_tags";a:0:{}s:8:"accounts";a:1:{i:0;s:7:"kazu634";}}' categories: - つれづれ ---
ソフトウェア開発者試験ででてきた再帰を使った関数を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))))
こうでもいいわけか。