我正在尝试编写一个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;
}
答案 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");
}
}