【问题标题】:Number of digits in a number with lisp using cond使用 cond 使用 lisp 的数字中的位数
【发布时间】:2016-11-15 22:16:52
【问题描述】:

所以,我知道有一个使用以下 if 语句的解决方案

    (defun numdigits (n)
      (if (< -10 n 10)
         1
         (1+ (numdigits (truncate n 10)))))

但我正在努力加深我的知识并理解将 if 语句转换为 cond 语句。所以我尝试使用 cond 语句,但我收到一个错误,老实说,我不知道为什么。

这就是我所做的:

    (defun nbDigits (digit)
     (cond 
          ((> 0 (- digit 10)) 1)
          (t (1 + (nbDigits (truncate digit 10))))
      )
     )

我的逻辑是: 如果 0 大于 x-10,则返回 1(因为这意味着该数字小于 10)。否则,返回 1 + nbDigits(数字除以 10 的商),这应该一直持续到达到基本情况。

我收到错误: 仿函数位置中的非法参数:1 in (1 + (NBDIGITS (TRUNCATE DIGIT 10)))。 但我不明白如何解决这个错误。我打错电话了吗? 谢谢。

【问题讨论】:

  • Lisp 中函数调用的语法是什么?
  • (函数参数)?
  • @R.DM 没错,所以(1 + (nbDigits ...)) 表示将1 作为函数调用,+(nbDigits ...) 作为两个参数。注意(1+ ...)(1 + ...) 之间的区别。第一个调用名为1+ 的函数,第二个调用名为1 的函数。
  • 空格将函数名与函数参数分开,参数彼此分开。
  • ( 后面仍然没有函数名。你要调用的函数是+,所以你需要一个看起来像(+ 1 ...)的东西

标签: lisp


【解决方案1】:

1+ 之间的一个简单空格将函数 1+ 更改为两个元素。删除那个空间,你就完成了。

顺便说一句,通过写(&lt; digit 10) 而不是(&gt; 0 (- digit 10)) 来简化你的数学

最后应该是这样的:

(defun nbDigits (digit)
     (cond 
          ((< digit 10) 1)
          (t (1+ (nbDigits (truncate digit 10))))
      )
     )

【讨论】:

  • 嗯...原始返回所有整数的正确值,第二个仅用于正整数(在您的情况和 OP 的情况下)。
  • 没错,但不要忘记 R.DM 的目的只是为了获得 cond 的经验。实际上,人们永远不会想到像这样实现这个功能。我会选择 (length (format nil "~d" (abs n))) 或 (1+ (truncate (log (abs n) 10)))
  • 是的,我只是担心“我正在尝试用 cond 重写此函数”导致不同的函数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-23
  • 2015-10-16
  • 2021-01-08
  • 2014-11-15
  • 1970-01-01
相关资源
最近更新 更多