【问题标题】:What is wrong with this Lisp Function?这个 Lisp 函数有什么问题?
【发布时间】:2011-04-24 02:49:49
【问题描述】:

这个函数是一个 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 ) ) )
)
)

这些都应该取最小值 (m) 和最大值 (M),并返回从最小值到最大值的整数列表(不包括最大值 / 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         ^
    ---------/

我快疯了,想弄清楚为什么它的表现不像我追踪的那样。

同样,当我执行该函数时,它会导致 NIL。

【问题讨论】:

  • 您的第二个函数是 Scheme 代码,第一个函数是 Common Lisp。你的 Scheme 函数在我的机器上工作,Common Lisp 版本看起来也应该。 (我没有尝试过,因为我没有在这台机器上安装 Common Lisp。)
  • CLisp 是一个 Common Lisp 实现。你在用那个吗?该语言称为 Common Lisp,而不是 CLisp。

标签: function recursion lisp functional-programming clisp


【解决方案1】:

我使用 SBCL 运行它,它抱怨变量 M 在参数列表中出现了两次。 Lisp 对变量名不区分大小写。

改成

(defun range (m MM) 
  (cond
      ((> m MM) '() )
      ((= m MM) '() )
      ((< m MM) (cons m (range (+ m 1) MM)))))

效果很好。

> (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)

我检查了 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)

这是你的版本:

[3]> (defun range (m M) (cond ((>= m M) '())((< m M) (cons m (range (+ m 1) M)))))

RANGE

[4]> (range 1 4)
Nil

【讨论】:

  • 是的,我用 CLISP 检查过。使用不同的变量名,它可以正常工作。与 SBCL 不同,CLISP 不会发现错误。 [1]> (defun range (m MM) (cond ((>= m MM) '() ) (( (range 1 4) (1 2 3) 这是你的版本:[3]> (defun range (m M) (cond ((>= m M) '() ) (( (range 1 4) Nil
  • 这是我认为的正确答案。您可以修复格式以便更易于阅读吗?帮助在这里stackoverflow.com/editing-help
  • 我认为主要的教训(甚至比学习某些语言不区分大小写更重要)是使用专有名称! 'm' 对代码的读者意味着什么?没有。使用专有名称并告诉您的老师标记任何未在作业中使用专有名称的人。
猜你喜欢
  • 1970-01-01
  • 2017-03-26
  • 2014-06-29
  • 2011-02-13
  • 2011-08-26
  • 1970-01-01
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多