如果我从函数中删除“else”,为什么输出会有所不同?

时间:2017-05-31 18:11:39

标签: c++ greatest-common-divisor

我正在尝试编写一个GCD函数来使用euclids算法计算两个整数的gcd。在函数中如果我擦除“else”它输出3是不正确的。但是,如果我使用“else”,它输出1,这是正确的输出。我假设如果我不使用“其他”,该功能仍然是正确的。为什么我会得到两个不同的输出。

这是我的代码,

 #include <iostream>

using namespace std;


int euclidGcd(int x , int y){

    if(x%y!=0)
        euclidGcd(y , x%y );
    else
        return y;

}

int main(){

    cout<<euclidGcd(2,3)<<"\n";


    return 0;
}

1 个答案:

答案 0 :(得分:2)

您的功能有未定义的行为。当int euclidGcd(int x, int y) { if ((x % y) != 0) return euclidGcd(y, x % y); // <-- here else return y; } 运算符返回非零值时,您的函数根本不返回任何内容,因此输出是垃圾。您需要返回递归调用的结果:

int euclidGcd(int x, int y)
{
    if (y != 0)
       return euclidGcd(y, x % y);
    else
       return x; 
}

但是,根据算法的Wikipedia's description,函数应该是这样的:

int euclidGcd(int x, int y)
{
    while (y != 0)
    {
        int t = y; 
        y = x % y; 
        x = t; 
    }
    return x;
}

或者,使用完全不使用递归的其他描述的实现:

司基于:

int euclidGcd(int x, int y)
{
    while (x != y)
    { 
        if (x > y)
            x -= y; 
        else
            y -= x; 
    }
    return x;
}

基于减法的:

public class SplashLandscapeActivity extends AppCompatActivity {
    static boolean isRunStop = false;
    static int counter = 0;
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
            counter++;
            Log.d("start", "xxxx run handler SplashLandscapeActivity. Time : "+counter);
            Toast.makeText(SplashLandscapeActivity.this, ""+counter, Toast.LENGTH_SHORT).show();
            new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                Log.d("start", "xxxx run handler SplashLandscapeActivity");
                if(!isRunStop )
                {
                      startActivity(new Intent(SplashLandscapeActivity.this, TestActivity.class));
                      isRunStop =true;
                      finish();
                }

            }
        }, 500);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d("start", "xxxx onDestroy Activity SplashLandscapeActivity");
    }
}