関数的な言語

現在Lisp、ML、F#等のfunctionalプログラミング言語を見ています。普段に使うC++,C#などとどう違うかが注目です。Lispはダイナミック型システムがあるから関数を宣言する時にパラメターの型を書かない。
I have been wondering whether Lisp provides any advantages over procedural languages which make it the most popular language for AI (人工知能) development. It seems that its inherently recursive style (the body of a function is more likely to be an invocation of the a function rather than a series of assignments to state variables) might make it easier for search and optimization problems which involve recursion to be modeled. e.g. If you have a list of graph nodes and want to check the first one, then call the same function on all its neighbors, this might be written quite concisely in LISP. I was able to write a method to output an arbitrary number of the Fibonacci numbers in the following five lines.
(defun recFib (mylist cur prev num termsToFind)
(defvar tmp num)
(setq tmp 0)
(if (= num termsToFind)
(append mylist ())
(recFib (setq num (+ num 1) tmp prev prev cur cur (+ cur tmp) mylist (append mylist (list prev)) )
cur prev num termsToFind)

)
)
It seems that many problems in AI such as visual recognition and decision making might be reduced to recursive searches.
A logistical problem involved the interpreter window, which outputs only the first 10 elements of a list. I circumvented this by using a form and setting its range to be my list. A second source of confusion is regarding how multiple procedures might be executed sequentially.
I was able to set a variable multiple times as follows:
(defun test (twc) (defvar hk 2) (setq hk 3) (setq hk 4) (list 3 4 hk))
However, multiple functions cannot be nested in a single block of an if conditional. In addition, the code above generates a compiler warning about the "free" variable hk which is treated as "special". Perhaps this is what local variables are considered to be but the point is unclear.