2016-12-06 8 views
0

私は比較的一般的にCとプログラミングを学び始めており、再帰を使って2つの数のGCDとLCMを求めるプログラムを作るように言われました。C再帰関数 - GCD

今私はいくつかの研削の後、一緒にこれを得ることができました。

#include<stdio.h> 

int gcd(int a,int b); 

int main() 
{ 
    int a,b,l,temp; 
    printf("Enter two numbers :\n"); 
    scanf("%d%d",&a,&b); 
    if(a<b) 
    { 
     temp=a; 
     a=b; 
     b=temp; 
    } 
    l=gcd(a,b); 
    printf("GCD = %i\nLCM = %i",l,a*b/l); 

    return 0; 
} 

int gcd(int a,int b) 
{ 
    static int c; 
    c=a%b; 
    a=b; 
    b=c; 
    if(c!=0) 
    { 
     gcd(a,b); 
    } 
    else 
     return a; 
} 

私には何らかの理由で不明な点がありましたが、機能は「else」なしでは機能しません。より具体的には、次のようになります。

int gcd(int a,int b) 
{ 
    static int c; 
    c=a%b; 
    a=b; 
    b=c; 
    if(c!=0) 
    { 
     gcd(a,b); 
    } 
     return a; 
} 

割り当てには関係ありませんが、私はこの問題が何であるかを理解する必要があります。初心者として、私は何かすべての助けに感謝します。

質問があまりにも愚かであるかコードがあまりにも厄介であれば、事前にお詫びします。

+0

なぜローカル変数は再帰関数 'static'ですか?彼らはいけません。 –

+2

'if(c!= 0)'ブランチは値を返しません。 –

+1

そして 'gdc'の呼び出しは返された値を破棄します。 –

答えて

0

問題は、再帰呼び出しです:

int gcd(int a,int b) 
{ 
    static int c; 
    c=a%b; 
    a=b; 
    b=c; 
    if(c!=0) 
    { 
     gcd(a,b); // The problem is here 
    } 
    else 
     return a; 
} 

あなたは2つの異なるアプローチ行っている:c!=0場合は、return文を持っていないあなた上記の場合

  1. を。あなたの関数はintを返すためにを持っています。通常コンパイラは、あなたにちょっとした乱数see hereを返すので警告を出します。ですから、あなたの他の機能が動作することは運がいいとしましょう。
  2. elseステートメントがなければ、いつもが返されます。あなたはgcdを計算しますが、結果を使うことはありませんので、最初の呼び出しの結果は常にメインのaとbの間の小さな数字になります。関数を機能させるには、再帰呼び出しの結果を使用する必要があります。

正しいアプローチは、サンジャイ・sophoのような再帰呼び出しのあなたの結果を返すことですすでに言った:

return gcd(a,b); 

はさらに他にある場合と無い括弧の中括弧を使用するように悪いコーディングスタイルです;)どちらの場合も問題ありませんが、それは同じです。

0

コードの問題について尋ねました。ここでは、

static int c; 

は、なぜそれが静的で、さらにあなたは再帰を使ってGCDを計算する第三の変数は必要ありません。 および

gcd(a,b); 

gcdを返す変数は何ですか。これはまったく意味がありません。これはvoid関数ではなく、intを返します。今

それだ正しい方法、

if (b != 0) 
    return gcd(b, a%b); 
    else 
    return a; 

+0

その静的は、実際に私が以前に試みていたものから残っているものです。本当にそれを削除するとは思わなかった。 また、gcd(a、b)を使用してEuclideanアルゴリズムを実行していました。反復して値を代入し、c(剰余)が0になってaを返すときに再帰を停止するだけです。 私が言ったように、Cとは非常に新しく、それは再帰のためのケースです。 –