根据Böhm-Jacopini定理,一个算法只需使用三个语句即可编写:
- 顺序 - 选择 - 迭代
许多老师认为这个定理就像是信仰一样,他们教授时会建议不要使用(goto、jump、break、multiple return等)这些指令,因为这些指令都是邪恶的。
但是当我询问证明该定理的证据时,没有人能够提供。
个人认为该定理并非虚假,但实际应用时并不总是最佳选择。
因此,我进行了一些小型搜索,以下是我的疑虑:
1. 该定理已经在流程图结构归纳上得到证明,但它真的适用于计算机程序吗? 根据维基百科,“Böhm和Jacopini的算法转换并不是真正的实用程序,因此为这个方向的其他研究打开了大门。”
2. 定理的一个推论是每个“goto”可以通过归纳转换为选择或迭代,但效率呢? 我找不到任何证明表明每个算法都可以重写,保持相同的性能。
3. 递归,一个递归算法是否真的可以只使用顺序、选择和迭代来编写? 我知道一些递归算法可以优化为循环(想想尾递归),但是否真的适用于所有情况?
4. 清晰的代码,我知道过多地使用跳转可能会创建一个庞大的代码,但我认为在某些情况下,在循环中正确使用break可以提高代码的可读性。
个人认为,这个定理并非为了编写更好的代码而创立,认为清晰的代码必须遵循该定理,是由于一种奇怪的主观原因在世界上传播开来。
我发现了这篇有趣的文章:https://www.cs.cornell.edu/~kozen/papers/bohmjacopini.pdf,我认为这证明了真正的程序不必强制遵循Jaopini定理。您是否得出相同的结论?
总之,我想知道一个只使用(序列、选择和迭代)的程序是否真的比使用不同语句的其他程序更好,并且是否有证据或者说这只是主观看法?
- 顺序 - 选择 - 迭代
许多老师认为这个定理就像是信仰一样,他们教授时会建议不要使用(goto、jump、break、multiple return等)这些指令,因为这些指令都是邪恶的。
但是当我询问证明该定理的证据时,没有人能够提供。
个人认为该定理并非虚假,但实际应用时并不总是最佳选择。
因此,我进行了一些小型搜索,以下是我的疑虑:
1. 该定理已经在流程图结构归纳上得到证明,但它真的适用于计算机程序吗? 根据维基百科,“Böhm和Jacopini的算法转换并不是真正的实用程序,因此为这个方向的其他研究打开了大门。”
2. 定理的一个推论是每个“goto”可以通过归纳转换为选择或迭代,但效率呢? 我找不到任何证明表明每个算法都可以重写,保持相同的性能。
3. 递归,一个递归算法是否真的可以只使用顺序、选择和迭代来编写? 我知道一些递归算法可以优化为循环(想想尾递归),但是否真的适用于所有情况?
4. 清晰的代码,我知道过多地使用跳转可能会创建一个庞大的代码,但我认为在某些情况下,在循环中正确使用break可以提高代码的可读性。
n = 0;
while (n < 1000 || (cond1 && cond2) || (cond3 && cond4) || (cond5 && cond6))
{
n++;
//The rest of code
}
可以重写为:
for (n = 0; n < 1000; n++)
{
if (cond1 && cond2) break;
elseif (cond2 && cond3) break;
elseif (cond4 && cond5) break;
elseif (cond6 && cond7) break;
//The rest of code
}
个人认为,这个定理并非为了编写更好的代码而创立,认为清晰的代码必须遵循该定理,是由于一种奇怪的主观原因在世界上传播开来。
我发现了这篇有趣的文章:https://www.cs.cornell.edu/~kozen/papers/bohmjacopini.pdf,我认为这证明了真正的程序不必强制遵循Jaopini定理。您是否得出相同的结论?
总之,我想知道一个只使用(序列、选择和迭代)的程序是否真的比使用不同语句的其他程序更好,并且是否有证据或者说这只是主观看法?
break
或continue
)有其存在之处,但Dijkstra在很大程度上赢得了这场战争。 Böhm-Jacopini定理与此关系不大(除了对那些声称绝对需要goto的程序员提供回应)。结构化编程的成功是令人信服的。 - John Coleman