写在开始
最近在学习Scheme,然后试着写了一点比较常见的算法,一个就是这个斐波那契数列,另外还有一个尾递归求阶乘的程序.
贴代码
#lang racket
(begin
(define (fact n sum)
(if (= n 1)
sum
(fact (- n 1) (* n sum))))
(define (fib i j sum)
(if (< i sum)
(begin
(display (+ i j))
(newline)
(fib (+ i j) i sum)
)
(newline))
)
(fib 1 1 (fact 1000 1))
)
这是一个简单粗暴的设计方式,一个尾递归的阶乘函数和一个应该是属于尾递归的斐波那契数列.一般情况下比较喜欢用尾递归,当然了,阶乘是可以用递归实现的,比如下面这个:
(define (fact n) (
(if (= n 1) (
1
(* n (fact (- n 1))))
)
)
)
似乎比尾递归版本的还要简洁呢,不过效率可能就不好了...
写在最后
感觉这种S-表达式真的好有趣,虽然乍一看可能有点反人类,但是确实感觉不错,手写语法树的方式来写代码.