--- 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))))

こうでもいいわけか。