Recursion 使用car/cdr实现LISP递归

Recursion 使用car/cdr实现LISP递归,recursion,lisp,Recursion,Lisp,我需要在使用LISP的作业中得到帮助。我需要创建一个程序(两个不同的函数),它可以获取((PRO)(LAN))之类的输出,并将其转换为NATO(PapaRomeoOscar LimaAlfaNovember)。同时能够将北约组织转换成英语,((帕帕罗梅奥斯卡)(利马阿尔法诺文博))转换成亲局域网 它需要使用递归,没有循环,并且没有任何变量。我的教授复习了一周的LISP,给我们看了一些基本的程序。我对这件事一无所知 我的想法是,我需要将列表合并在一起,然后使用列表中的汽车,并使用if语句检查它:

我需要在使用LISP的作业中得到帮助。我需要创建一个程序(两个不同的函数),它可以获取((PRO)(LAN))之类的输出,并将其转换为NATO(PapaRomeoOscar LimaAlfaNovember)。同时能够将北约组织转换成英语,((帕帕罗梅奥斯卡)(利马阿尔法诺文博))转换成亲局域网

它需要使用递归,没有循环,并且没有任何变量。我的教授复习了一周的LISP,给我们看了一些基本的程序。我对这件事一无所知

我的想法是,我需要将列表合并在一起,然后使用列表中的汽车,并使用if语句检查它:

(if (= car(L1 L2) "i")
  (format -t “India ”)
(format -t ""))
然后递归地获取列表的cdr,并递归地传递它。任何帮助都会很有帮助。我一直在网上寻找示例代码,但找不到类似的代码。我去了她的办公室,她说我们应该根据她的笔记知道怎么做,这些笔记是简单的阶乘函数

那么,要把北约组织转换成英语,我认为你需要反对这份名单,坐上这份名单上的车。然后取汽车中的汽车,使用与上面类似的if语句。然后获取cdr并递归地将其传回。我不确定代码会是什么样子,所以我需要很多帮助。提前谢谢

(if (= car(L1 L2) "i")
  (format -t “India ”)
(format -t ""))
此代码段中的一些问题:

  • (=car(l1l2)“i”)
    读作:将函数
    =
    应用于三个参数:名为
    car
    (l1l2)
    “i”
    ,其中
    (l1l2)
    是将函数
    L1
    应用于参数
    L2
    。如果您想乘坐列表中的
    汽车
    ,请使用
    (汽车列表)

  • =
    仅对数字有效:传递任何其他内容(如字符串)都不会按预期工作。在比较字符串时使用
    string=
    ,或者更好,在这一步不要使用字符串。例如,请参见
    assoc
    符号名称
    字符串大写

  • (格式-t“”)
    中的
    -t
    不正确。如果要写入新字符串,请使用
    nil
    。如果要输出到标准输出,请使用
    t

  • (format-t“India”)
    :请注意,您使用的是
    引号,而这些引号不应在您的程序中使用(
    )。此外,您总是打印空格,如果您想将不同的单词连接在一起,这是一个问题,如作业中所述(例如
    “AlfaBeta”


你用C语法编写Lisp。不要这样做。甚至你认为你可以使用Algl经验,比如你知道Python C,因为C,C++,Perl和Python在同一语言中的时候是同化的,Lisp不是。我花了一些时间来找到< <代码> > <代码>循环。实际上,一年多。

我想也许输入应该是
((pro)(lan))
,而不是
((pro)(lan))
。这些改变了你需要的很多

您理解作业中的输入/输出吗?由于您正在打印到标准输出,而不是返回,这是否意味着您应该从标准输入中读取输入,而不是函数中的参数?例如,假设此函数反转列表:

(defun my-reverse (list)
  (labels ((helper (list acc)
              (if (endp list)
                  acc
                  (helper (cdr list) (cons (car list) acc)))))
    (helper list '())))

(my-reverse '(1 2 3)) ; ==> (3 2 1)
除了REPL打印函数调用返回的值外,它不读取或打印任何内容

你需要把你的问题分解成更简单的问题。想象一下,我只需要一个符号就可以了。例如,
(to nato'p);==>papa
,然后你就可以在一个递归函数中使用它来转换一个结构

祝你好运!

首先是算法 你似乎理解了它的原理。递归遍历列表是一个非常常见的习惯用法。Lisp:你拿一个列表,先用它的
做一些事情,然后用
其余的
CAR
/
CDR
是遗留名称,我更喜欢在可能的情况下使用更有意义的名称)

(取消打印间隔(对象)
(打印(第一个对象))
(打印每个(其余对象)))
当您进行递归时,唯一需要做的另一件事就是在某个地方终止,通常是当给您的列表是空列表时(注意,
(rest'())
⇒ <代码>()
,因此,如果一个函数只是在列表的其余部分递归,它将永远不会停止)

(取消打印间隔(对象)
(当对象
(打印(第一个对象))
(打印每个(其余对象)))
如果需要从整个操作中收集结果,通常的方法是使用累加器,这是一个累加该结果的函数参数

(defun add every(数字和可选总和)
(如有的话)
(每增加一个(剩余数字(+(第一个数字)和))
总数)
第二,语法 与任何其他编程语言一样,您需要格外小心,不要在语言B中使用来自语言A的内容

以破折号开头的参数类似于
-t
,您将在bash中看到,而不是在Lisp中看到。
(格式t“foo”)
将打印
foo
(以及换行符)

在Lisp中,
(foo-bar(12)3)
为函数
bar
提供参数
1
2


同样,在Lisp中,什么样的表达式是括号和空格呢?那么
'(pro)
是一个包含一个符号的列表,而
'(pro)
是一个包含三个符号的列表。

你所说的“((pro)(LAN))是什么意思"?这应该是一个字符串吗?一个数据结构吗?所有的说明都说,它是否将一个输入作为一个短语,并将其北约代码显示为一个字符串请仔细阅读您的作业。在第一种情况下,输入是以单个字符命名的符号列表,在第二种情况下,输入是以北约字符名称命名的符号列表钕