Hmm....
你需要《程序设计语言的形式语义》
你能写一个 C 语言代码的 “解释器” 吗?
while (1) {
stmt = fetch_statement();
execute(stmt);
}
“解释器” 的例子:用基础结构模拟函数调用和递归
ChatGPT 竟然改写对了!而且给出了非常优雅 (但也有缺陷) 的实现
void hanoi_non_recursive(int n, char from, char to, char via) {
struct Element { int n; char from; char to; char via; };
std::stack<Element> elements;
elements.push({n, from, to, via});
while (!elements.empty()) {
auto e = elements.top();
elements.pop();
if (e.n == 1) {
printf("%c -> %c\n", e.from, e.to);
} else {
elements.push({e.n - 1, e.via, e.to, e.from});
elements.push({1, e.from, e.to, e.via});
elements.push({e.n - 1, e.from, e.via, e.to});
}
}
}
给了他一个更难的题,果然翻车了 (思路基本正确,但不再优雅)
int f(int n) {
if (n <= 1) return 1;
return f(n - 1) + g(n - 2);
}
int g(int n) {
if (n <= 1) return 1;
return f(n + 1) + g(n - 1);
}
(你们会写这个的非递归吗)
状态
初始状态
main(argc, argv)
;全局变量为初始值状态迁移
然后看看我们的非递归汉诺塔 (更本质)