recursion - 从数字中减去 1(Prolog 中的递归)
问题描述
我试图了解如何在 Prolog 中编写递归函数。我提供了以下代码:
reduceBy1(Input,Output) :-
(Input > 0 -> Output is Input - 1).
调用 reduceBy1(10,Output)。结果为 9。到目前为止,一切都很好。但是我如何将 Output 传回 redcyBy1\2 ?
解决方案
这是一种方法:
reduceBy1(0,[]).
reduceBy1(H,[H|T]) :-
(H>0->
H1 is H-1,
reduceBy1(H1,T)).
假设您提供一个数字作为输入,现在您希望它按降序打印所有数字。输出列表应以 1 结尾。
第一个谓词是基本情况:它表示当在我们的例子中为 H 的 Input 为 0 并且列表中的任何内容时,程序都应该停止。基础谓词是带有结束条件的谓词。对于下一个谓词,我们将 H 作为输入,将 [H|T] 作为输出,意思是从输入数字开始输出,这就是为什么 [H|T]。然后检查 Input 是否大于 0,然后减去 1 并将其保存到 H1。现在我们给 reduceBy1 新值 H1 ,它成为新的 input , T 是开始将数字存储为列表的输出。该程序遍历每个谓词以查看哪个谓词是成功的。如果输入=0 [当数字不断递减直到我们达到那种情况时会发生这种情况],所以当它检查基本谓词时它是成功的。该程序通过给出此时存储在列表中的任何内容来结束。
?-reduceBy1(6,L).
L = [6, 5, 4, 3, 2, 1]
?-reduceBy1(10,L).
L = [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
?-reduceBy1(-5,L).
False
推荐阅读
- ms-access - 如何从另一个表单中读取值并将其分配给另一个表单中的字段
- excel - Excel 错误的 Unicode 字符
- google-chrome - Selenium Grid Extras 2.0.4:org.openqa.selenium.WebDriverException:转发新会话时出错
- c# - 无法从 C# 应用程序将文件上传到 Orthanc 服务器
- excel - 引用在其公式中返回空单元格的单元格
- android - Fastlane gradle 命令 - 属性未通过
- sql-server - 如何在 sql server 中使用 datepart 和 date
- laravel - 如何使用工匠 Tinker 更新数据库中的数据
- c# - 更改标记代码的属性值
- asp.net - IIS7 Windows 2008 R2 w3wp.exe 未释放内存