大家好我从power point幻灯片中得到了这个例子,我似乎不明白为什么函数中的while循环只发生一次。我解释它的方式是它将永远存在,但显然它不会。
#include <stdio.h>
int main()
{
int a = 481;
int b = 910;
int result = 0;
result = gcd(a, b);
printf("%d\n", result);
return 0;
}
int gcd(int a, int b)
{
while(b!=0) // HERE IS MY PROBLEM!, Wouldn't this while loop go on forever?
{
int tmp = b;
b = a% b;
a = tmp; // how could 'a' be 13 if tmp is 0, at beginning they do tmp = b(0)
}
return a;
}
我只是没有得到它...它说虽然b不等于0,而我们的b是910,所以它永远不会是0,这意味着while循环从不结束现在呢?同样在函数tmp = b中为0,然后它们修改b,但是即使它们修改了b temp仍然是0,因为b在被修改之前原来是0 ..这里的融合..
编辑: 我犯了错误,说tmp = b总是0,从内部函数看b的值,忘了b从外面是910.
答案 0 :(得分:2)
循环运行不止一次,每次循环运行时,b的值将小于前一次迭代,因为(a%b)是[0,b]范围内的整数,不包括湾
在第一次迭代中: a = 481,b = 910
第二次迭代: b = a%b =&gt; 481 a = 910
第三次迭代 a = 481 b =(910%481)= 429
tmp永远不会为0,因为如果b为0,则循环停止,0将不会分配给tmp。
答案 1 :(得分:2)
首先请注意,变量a
和b
会按值传递给gcd()
。这意味着函数a
中的局部变量(参数)b
和gcd()
与a
中的变量b
和main()
无关除了命名的巧合。
在函数内,在循环之前,值为:
a = 481 b = 910
由于b
不为零,因此执行循环:
a = 481 b = 910
tmp := 910
b := 481 % 910 := 481
a := 910
然后循环再次检查,b
仍不为零:
a = 910 b = 481
tmp := 481
b := 910 % 481 := 429
a := 481
并且循环再次重复,因为b
仍然不为零:
a = 481 b = 429
tmp := 429
b := 481 % 429 := 52
a := 429
再次:
a = 429 b = 52
tmp := 52
b := 429 % 52 := 13
a := 52
和循环体的最后一次:
a = 52 b = 13
tmp := 13
b := 52 % 13 := 0
a := 13
现在b
为零,因此循环终止,并返回a
中13
的值。
请注意a
中b
和main()
的值不变。您可以通过以下方式证明:
printf("GCD(%d, %d) = %d\n", a, b, result);
这是一个更好的输出,因为它识别输入值和结果。
答案 2 :(得分:2)
如果你自己完成每次迭代,你会发现它确实终止了:
迭代1:
a == 481
b == 910
迭代2:
a == 910
b == 481
迭代3:
a == 481
b == 429
迭代4:
a == 429
b == 52
迭代5:
a == 52
b == 13
迭代6:
a == 13
b == 0&lt; - TERMINATES
请稍后询问它是否有意义。