recursion - 在序言中按升序打印 0 到 10
问题描述
我尝试过遵循代码,但没有奏效。此代码中的错误是什么..?
asc(0):-
write(0).
asc(X):-
asc(X-1),
write(X).
解决方案
Prolog 没有像其他语言那样自动评估为值的算术表达式。X-1
不表示算术值;这只是一个术语。
?- X = 5, Y = X - 1.
X = 5,
Y = 5-1.
要计算算术值,您必须使用is/2
谓词:
?- X = 5, Y is X - 1.
X = 5,
Y = 4.
因此,asc(X-1)
您必须单独计算 的值X - 1
并将结果传递给递归调用,而不是调用:
asc(0) :-
write(0).
asc(X) :-
X > 0,
X1 is X - 1,
asc(X1),
write(X).
需要守卫X > 0
来避免沿负数的无限递归。
推荐阅读
- sql - 将多个入口实例合并为一个,将差异合并为数组
- android - 更新到 Android 11 后 Admob 中出现严格的安全 Cookie 策略错误
- flutter - 在构建期间调用 setState() 或 markNeedsBuild()。调用原生广告时
- python - Python中的秒表函数
- c# - 在 C# 中第二次出现逗号时拆分字符串
- javascript - 如何为下一次渲染剩余的char jquery javascript触发焦点键
- angular - Typescript 将静态元数据添加到类并在运行时读取
- excel - 如何在输入字符之前在下面的单元格中添加('),以便excel不会将第一个字符(“@”)作为公式读取
- asp.net - IIS - 请求阻止规则
- laravel - Laravel 8 目标类不存在。[App\Http\Controllers\registerController]