为什么这个函数的while循环无限运行?

时间:2014-10-05 21:02:02

标签: c

大家好我从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.

3 个答案:

答案 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)

首先请注意,变量ab会按值传递给gcd()。这意味着函数a中的局部变量(参数)bgcd()a中的变量bmain()无关除了命名的巧合。

在函数内,在循环之前,值为:

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为零,因此循环终止,并返回a13的值。

请注意abmain()的值不变。您可以通过以下方式证明:

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

请稍后询问它是否有意义。