LISP二项式系数,阶乘

时间:2012-06-08 15:19:58

标签: lisp elisp factorial binomial-coefficients

我是lisp的新手, 我尝试在lisp中编程一个程序,它计算二项式系数迭代(阶乘)但不递归。 我试过everthing,全局函数,局部函数(factorial)), 但我的程序不起作用,例如当我命令:(binom(7 4))时,只是出错了

    SELECT ALL
(defun binom-coef(a b)   
       (if (or (< a b) (< b 0))
       nil            )    
      
       (flet fakul(n)    ; factorial
               (cond ((= n 0) 1)
              (t (* n (fakul (- n 1))))))
   (/ (fakul a) (* (fakul b) (fakul(- a b)))))

我还有一个问题,如何在emacs中编译?

(我试过缓冲区 - &gt; scatch - &gt;(加载“binom-coeff.el” 但只有一条错误信息...)

非常感谢,:))

3 个答案:

答案 0 :(得分:3)

无论您是在Common Lisp还是在emacs-lisp中学习/编程,都必须下定决心。它们相似但不同,在学习时,混淆可能是一个障碍。

要学习Emacs Lisp,请阅读:

Emacs中的编程简介Lisp http://www.gnu.org/software/emacs/emacs-lisp-intro/或输入emacs M- :( info&#34;(eintr)Top&#34;)RET

要了解Common Lisp,请查看http://cliki.net/Getting+Started

答案 1 :(得分:1)

您最好的选择是使用EMACS安装SLIME。它使用SBCL,这是常见的lisp版本。尝试使用C-C C-C或C-C C-K进行编译。然后用C-C C-Z打开一个新的缓冲区并运行程序。我也想自学。在学习新语言的同时学习EMACS并不是最容易的事情。至少对我而言。

答案 2 :(得分:1)

我喜欢这个教程http://steve-yegge.blogspot.com/2008/01/emergency-elisp.html它非常简短且信息丰富。

如果它是你想要的elisp,只需在关闭括号后使用C-x C-e。那里你有很多错误。

(defun binom-coef(a b)
  ;; (if (or (< a b) (< b 0)) nil)
  ;; Wery strange expression. (if CONDITION IF-TRUE IF-FALSE). You
  ;; didn't set IF-FALSE, so it's nil by default, 
  ;; and you set IF-TRUE to nil. It allways returns nil.

  ;; If you want to leave from function when wrong args given
  (block nil
    (if (or (< a b) (< b 0)) (return))
  ;; can be throw/catch also

    ;; (flet fakul(n)
    ;;   ;; wrong usage of flet. It's used like let, (flet ((name1 args1
    ;;   ;; body1) (name2 args2 body2) ... )
    ;;   ;; BODY-WHERE-FUNCTIONS-ARE-VISIBLE)
    ;;   (cond
    ;;     ((= n 0) 1)
    ;;     (t (* n (fakul (- n 1))))
    ;;     ))

    (flet ((fakul (n)
             (cond
               ((= n 0) 1)
               (t                       ; shound be like (< 0 n)
                 (* n (fakul (- n 1))))
               )))
      (fakul 5)
      ;; => 120
      (/ (fakul a) (* (fakul b) (fakul(- a b))))
      ;; ^ Inside flet ^
      ))
  )
(binom-coef 8 3)  ; <= look, it's not (8 3), because (8 3) means
                  ; execute function `8' with argument 3. If you
                  ; wanted to pass list with 8 and 3, it should be
                  ; (quote (8 3)), or simply '(8 3)
;; => 56