- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我想遍历一个列表(可能有嵌套列表)并将其计算为一个包含所有元素的扁平化列表。我什至无法获得递归函数来评估除 nil
以外的任何值
(defun pl(lst)
(if (atom lst)
lst
(progn
(pl (car lst))
(pl (cdr lst)))))
然后我会调用类似 (pl '(1 (2 3) (4 5)))
的东西, 但它总是评估为 nil
.
我变了
(if (atom lst) lst
到
(if (atom lst) (print lst)
这甚至不会打印列表中的任何项目。
我在这里缺少什么概念?
最佳答案
一个函数通常只会返回一个值,即函数体的值。如果仔细查看 pl
,您会发现它是一个 if
形式,因此 pl
要么返回 lst
或 progn
的值。
我在这里首先要指出的是,(progn ...)
形式的返回值是其最后一个表达式的值,在本例中是递归调用 (pl (cdr lst))
。由于您未对 (pl (car lst))
的返回值执行任何操作,因此此调用没有任何效果。递归调用的值将在某个时刻通过 atom
测试。这里要指出的第二件事是 (atom nil)
也是如此。请记住,列表的最后一个元素是 nil
,因此当您给 pl
一个列表时,它会总是返回 nil,正如您观察到的那样。
如果您的打印版本什么也没显示,可能是因为打印输出显示在其他地方,例如另一个缓冲区。
至于解决方案:您要么想要使用 append
而不是 progn
的纯递归解决方案,因为这就是您的家庭作业。在常规 lisp 中,您只需使用其中一种迭代结构。
我的建议是查看任何有关 lisp 或 scheme 的教科书,以掌握递归和尾递归的基础知识。
关于list - 只是试图递归地打印一个列表,但没有打印,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6494113/
我是 C++ 的新手,我在使用这段代码时遇到了问题: string output_date(int day, int month, int year){ string date; if
所以我这样做了 tar cvzf test.zip FP 为了创建目录 FP 的 zip 但是,它会列出 zip 中的目录 FP/ FP/php/ FP/php/pdf/ FP/php/docs/ F
我正在尝试在 Swift、Xcode 7.3(所以是 Swift 2.2)中创建一个通用类,但我似乎无法让它通过编译器: protocol Struct1Protocol { } struct Str
我的测试用例是这样的: class FooTest extends PHPUnit_Framework_TestCase { /** @covers MyClass::bar */ f
我正在尝试将brew install wine作为使electron-builder工作的一步。但是我所能得到的只是以下响应: ==> Installing dependencies for wine
我这样做: string[,] string1 = {{"one", "0"},{"Two", "5"},{"Three","1"}}; int b = 0; for(int i = 0; i <=
我正在尝试使用 SetWindowsHookEx 键盘 Hook Notepad.exe。 如您所见,工作线程正在将其 ASCII 代码(即 wParam)发送到指定的服务器。 UINT WINAPI
我正在尝试将 ListView 实现到我的 Fragment 中,但无论我尝试什么,我都会得到一个 NullPointerException。我检查对象是否为 null 并记录是否为 null,看起来
我尝试在一行中对齐两个 div。使用 float left 属性,一切顺利。但是当我在 div 中使用图像时,它开始产生问题。 所以这是我的示例代码:- Some headi
我目前正在使用此代码来获取图像的灰度图像表示并以 (512, 370, 1) 的格式表示它大批。 img_instance = cv2.imread(df.iloc[i][x_col]) / 255.
总结 我正在创建一个简单的应用程序,它允许用户选择一个包含顶级窗口的进程。用户首先键入 native DLL(而非托管 DLL)的路径。然后用户键入将在 Hook 过程中调用的方法的名称。该方法不得返
我是一名优秀的程序员,十分优秀!