写在开始

最近在学习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-表达式真的好有趣,虽然乍一看可能有点反人类,但是确实感觉不错,手写语法树的方式来写代码.

Last modification:January 27th, 2020 at 01:32 pm