如何在通用Lisp中递归地添加列表?

金枪鱼
(defun foo (in i out)
    (if (>= i 0)
        (progn
            (append (list (intern (string (elt in i)))) out)
            (print output)
            (foo in (- i 1) out )
        )       
        (out)
    )
)

(print (foo "abcd" (- (length "abcd") 1) (list)))

我试图将此字符串返回为(abcd)。但是它确实返回nil作为输出。我在这里做什么错?谢谢

卡兹

您只有一些小错误。首先,我们需要摆脱output(output); 这些与代码无关。看来您正在使用一个名为的变量output,然后将其重命名为out而不修复所有代码。而且,(output)是一个函数调用;它期望一个被调用的函数output存在。

其次,append必须以某种方式捕获的结果progn你只是丢弃它。这是一个工作版本:

(defun foo (in i out)
  (if (>= i 0)
    (foo in (1- i) (cons (intern (string (elt in i))) out))
    out))

另请注意(append (list X) Y),我使用的是更高效,更惯用的语言,而不是您的语言(cons X Y)cons操作的结果必须传递给fooout参数是我们的累加器,其通过尾递归螺纹; 到目前为止,它拥有我们列表中的多少。

即我们不能(progn <make-new-list> (foo ... <old-list>)); 只会创建新列表并将其丢弃,然后将旧列表传递给递归调用。由于旧列表最初为nil,所以我们一直沿用它nil,当索引为零时,即弹出该列表。我们需要(foo .... <make-new-list>),这就是我所做的。

测试:

[1]> (foo "" -1 nil)
NIL
[2]> (foo "a" 0 nil)
(|a|)
[3]> (foo "ab" 1 nil)
(|a| |b|)
[4]> (foo "abcd" 3 nil)
(|a| |b| |c| |d|)
[5]> (foo "abcd" 3 '(x y z))
(|a| |b| |c| |d| X Y Z)

最后,如果您希望(|a| |b| |c| |d|)符号显示为(a b c d),则必须弄弄readtable-case

当然:

[6]> (foo "ABCD" 3 nil)
(A B C D)

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

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

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在Java中克隆通用列表?

如何在目录中递归地找到最新的修改文件?

如何在OpenAPI / Swagger中递归地引用类型定义?

如何通过递归在链接列表中添加元素?

如何在Lisp中创建列表的子列表?

如何在通用Lisp中编写Multf函数

如何在TypeScript / Javascript中递归地迭代对象数组

如何在通用列表中的每个按钮上添加字符串?

如何在通用Lisp中创建位数组?

如何在awsAccordion列表中添加列表?

如何在Common Lisp中遍历列表和范围?

如何在F#中编写通用的递归扩展方法?

如何在通用Lisp(SBCL)中执行execve()?

如何在列表中添加静态列表?

递归地将树元素添加到新列表中-java

如何在F#中递归地添加列表中的所有元素?

C#如何最好地将字符串数组的元素添加到通用列表

如何在elisp中递归地传递函数?

如何在通用Lisp中获取类的所有实例?

如何在LISP中创建一个递归函数来计算原子在嵌套列表中出现的次数

如何在php中递归地展平树数组?

如何在 SML/NJ 中递归地制作随机填充的列表

如何在每个按钮单击事件后添加新项目并将以前的项目保留在通用列表中?

CVS:如何在 CVS 中递归获取修改/添加文件的列表

如何递归地向数组中的对象添加层 PHP

通用 lisp 中的递归“撰写”(从方案翻译)

如何在 C++ 中递归地编写组合

如何在 ExpandoObject 的通用列表中搜索

如何在 Common Lisp 中声明列表类型?