1 lisp recursion clisp functional-programming function
这个函数是一个CLisp函数,这是作业问题的一部分,但应该用这种不同的格式编写(第二个函数).
(defun range (m M) (cond
((> m M) '() )
((= m M) '() )
((< m M) (cons m (range (+ m 1) M ) ) )
)
)
(define (range m M) (cond
((> m M) '() )
((= m M) '() )
((< m M) (cons m (range (+ m 1) M ) ) )
)
)
Run Code Online (Sandbox Code Playgroud)
这些应该采用最小值(m)和最大值(M)并返回从min到max的整数列表(排除最大值/ M-1)
我一遍又一遍地追踪这个,我不明白为什么它只是返回NIL它一定是一个非常愚蠢的逻辑错误.
(range 1 4) => result (1 2 3)
m=1 | M=4 ==> return (cons 1 (2 3) )
m=2 | M=4 ==> return (cons 2 (3) )
m=3 | M=4 ==> return (cons 3 () )
m=4 | M=4 ==> return ()
v ^
---------/
Run Code Online (Sandbox Code Playgroud)
我疯了,想弄清楚为什么这不像我跟踪它.
同样,当我执行该函数时,它会导致NIL.
小智 5
我使用SBCL运行它,它抱怨变量M在参数列表中出现两次.Lisp对变量名称不区分大小写.
在改变它
(defun range (m MM)
(cond
((> m MM) '() )
((= m MM) '() )
((< m MM) (cons m (range (+ m 1) MM)))))
Run Code Online (Sandbox Code Playgroud)
它工作正常.
> (trace range)
> (range 1 4)
0: (RANGE 1 4)
1: (RANGE 2 4)
2: (RANGE 3 4)
3: (RANGE 4 4)
3: RANGE returned NIL
2: RANGE returned (3)
1: RANGE returned (2 3)
0: RANGE returned (1 2 3)
-> (1 2 3)
Run Code Online (Sandbox Code Playgroud)
我查看了CLISP.使用不同的变量名称可以正常工作.与SBCL不同,CLISP不会收到错误.
<[1]> (defun range (m MM) (cond ((>= m MM) '())((< m MM) (cons m (range (+ m 1) MM )))))
RANGE
[2]> (range 1 4)
(1 2 3)
Run Code Online (Sandbox Code Playgroud)
这是你的版本:
[3]> (defun range (m M) (cond ((>= m M) '())((< m M) (cons m (range (+ m 1) M)))))
RANGE
[4]> (range 1 4)
Nil
Run Code Online (Sandbox Code Playgroud)