最近,我一直在研究算法分析,在我的课堂上,我已经看到像这样的代码来代表示例算法:
z = 0
for x = 1; x <= n; x++ do
for y = 1; y <= n; y++ do
z = z + 1
end for
end for
我理解这些for循环可以理解为“只要x / y等于或小于n,请执行以下操作,并在每个循环结束时将x / y加1,然后再次测试条件”。但是,在诸如算法设计手册之类的一些书中,我看到的是这样的东西:
r:= 0
for i:= 1 to n do
for j:= 1 to i do
for k:= j to i + j do
r:= r + 1
return (r)
从本质上讲,它与我提供的第一个示例相同吗?或者它表示不同吗?我也感到矛盾的是,在第二个示例中,没有像x++
这样的增量,因此循环在一定数量的循环后停止。还有为什么为什么要声明k:= j
而不是简单地k:= 1
,因为在此算法中j = 1?
澄清:我并不是要问它们在产生相同输出的意义上是否做同样的事情,而是要问它们中的for循环是否与在n的值等于1之后停止工作相同?例如,在每个周期后将1加到变量i上,则匹配(如第一个示例中对x或y所做的操作)。
答案 0 :(得分:1)
您的第一个算法似乎使用的是类似C的符号,其中指定了起始状态,进行的条件以及每次迭代后如何更新状态。
第二个似乎使用基于在指定范围内迭代的循环:“对于此范围内的每个值,请执行以下操作……”。这在现代脚本语言(例如Python或Ruby)中相当普遍,并且可以说更接近人们对迭代的看法。
任何一种算法都可以使用另一种符号表示。
z := 0
for x := 1 to n do
for y:= 1 to n do
z := z + 1
return(z) # I’m assuming you actually wanted a return value
r = 0
for i = 1; i <= n; i++ do
for j = 1; j <= i; j++ do
for k = j; k <= i + j; k++ do
r = r + 1
end for
end for
end for
return(r)
使用一种或另一种样式粘贴,您会发现计数的差异并不是因为伪代码样式不同。这些是不同的算法。
答案 1 :(得分:0)
第二个与第一个并不完全相同。 我读了
for i;= 1 to n do
因为 1到n 为
for i = 1; i <= n; i += 1
在每个j循环中,k从j开始。所以k仅在第一个从1开始 每个i循环的j循环。
虽然第一种算法可以想象成行和列,而第二种却不是。
function a1(n) {
console.clear();
console.log('algorithm 1');
console.log('n = ' + n);
console.log('x | y | z');
var x, y, z = 0;
var tr, td;
for (x = 1; x <= n; x += 1) {
tr = document.createElement('tr');
for (y = 1; y <= n; y++) {
td = document.createElement('td');
z = z + 1;
console.log(x + ' | ' + y + ' | ' + z);
tr.appendChild(td);
td.innerHTML = z;
}
tbl1.appendChild(tr);
}
}
function a2(n) {
var i, j, k, r = 0;
console.clear();
console.log('algorithm 2');
console.log('n = ' + n);
console.log('i | j | k |i+j| r')
for (i = 1; i <= n; i += 1) {
for (j = 1; j <= i; j += 1) {
for (k = j; k <= (i + j); k += 1) {
r = r + 1;
console.log(i+ ' | ' + j + ' | ' + k + ' | ' + (i+j) + ' | ' + r);
}
}
}
return (r);
}
// output table 1 handle
var tbl1 = document.getElementById('output1');
// Event handlers for buttons a1 and a2
document.getElementById("a1_start").addEventListener("click", function(){
a1(5);
});
document.getElementById("a2_start").addEventListener("click", function(){
console.log('returns ' + a2(4));
});
td {
text-align: center;
border: solid 1px #000;
}
<button id="a1_start">
start algorithm 1
</button>
<button id="a2_start">
start algorithm 2
</button>
<table id="output1">
</table>