Common Lisp 中的递归、推送值和斐波那契数列

凯特琳

不是家庭作业。在以下代码中:

(defparameter nums '())

(defun fib (number)
  (if (< number 2)
      number
    (push (+ (fib (- number 1)) (fib (- number 2))) nums))
  return nums)

(format t "~a " (fib 100))

由于我对 Common Lisp 缺乏经验,我不知道为什么该函数不返回值。我试图打印斐波那契数列的第一个“n”值,例如 100。

谢谢你。

卡兹

您的函数无条件返回nums(但前提是return存在被调用的变量)。要了解原因,我们可以将其格式化为:

(defun fib (number)
  (if (< number 2)
    number
    (push (+ (fib (- number 1)) (fib (- number 2))) nums))
  return 
  nums)

如果number小于2,则它无number用地计算表达式,并丢弃结果。否则,它将(+ ....)表达式的结果推送到nums列表中。然后它无用地评估return,丢弃结果。如果调用的变量return不存在,那就是错误情况。否则,它会进行评估nums,这就是返回值。

在 Common Lisp 中,有一个return操作符用于终止和返回匿名命名块(名称为符号的块nil)。如果您使用 定义命名函数defun,则存在一个非匿名的不可见块:它与该函数具有相同的名称。在这种情况下,return-from可以使用:

(defun function ()
  (return-from function 42) ;; function terminates, returns 42
  (print 'notreached))     ;; this never executes

某些标准的控制流和循环结构会建立一个隐藏的匿名块,因此return可以使用:

 (dolist (x '(1 2 3))
   (return 42))            ;; loop terminates, yields 42 as its result

如果我们使用(return ...)但没有封闭的匿名块,那就是一个错误。

该表达式(return ...)与 just 不同return,后者计算以符号命名的变量return,并检索其内容。

不清楚如何修复您的fib功能,因为需求未知。将值推入全局列表的副作用通常不属于这样的数学函数,它应该是纯的(无副作用)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用递归在Lisp中生成斐波那契数列?

来自分类Dev

Jupyter和Common Lisp

来自分类Dev

(组成)在Common Lisp中

来自分类Dev

Common Lisp中的'()vs()

来自分类Dev

#ifndef在Common Lisp中

来自分类Dev

Common Lisp中的功能范围

来自分类Dev

更改-在Common Lisp中变为+

来自分类Dev

Common Lisp中的矩阵乘法

来自分类Dev

Common Lisp中的动态绑定

来自分类Dev

更改-在Common Lisp中变为+

来自分类Dev

Common Lisp中的功能范围

来自分类Dev

Common Lisp 中的变量范围

来自分类Dev

在Common Lisp中调用函数列表

来自分类Dev

在 common lisp 中获取“common-lisp:setf common-lisp:list* 未定义”

来自分类Dev

递归和斐波那契数列

来自分类Dev

Paul Graham的On Lisp(以及Ansi Common Lisp)中的撰写功能

来自分类Dev

Common Lisp函数未返回任何值

来自分类Dev

Emacs / Common Lisp:引用变量的值

来自分类Dev

从Common Lisp中的列表中删除项目

来自分类Dev

从Common Lisp中的列表中删除项目

来自分类Dev

如何在Common Lisp中映射功能?

来自分类Dev

关于Common Lisp中的MERGE函数

来自分类Dev

为什么FEXPR被丢弃在Common Lisp中?

来自分类Dev

Common Lisp中的条件Windows注释

来自分类Dev

Common Lisp中的环境目的是什么?

来自分类Dev

在Common Lisp中创建隐藏文件

来自分类Dev

从Common Lisp中的SQLite捕获错误

来自分类Dev

在Common Lisp(CLOS)中列出对象方法

来自分类Dev

在Common Lisp REPL中更改文本的颜色