-4

2 つの数値の GCDを計算するプログラム。

#include<stdio.h>
#include<conio.h>

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

void main()
{
 int n1,n2,gcd;
 clrscr();
 printf("\n GCD Calculator [ Please Enter Positive Integer number. ]\n");
 printf("\nEnter 1st numbers: ");
 scanf("%d",&n1);
 printf("\nEnter 2nd numbers: ");
 scanf("%d",&n2);
 if(n1>0 && n2>0)
 {
  gcd=findgcd(n1,n2);
  printf("\nGCD of %d and %d is: %d ",n1,n2,gcd);
 }
 else
 {
  printf("\n Sorry, Wrong Input.");
 }
 getch();
}

Cで再帰を使用して2つの数値のGCDを計算する別の方法はありますか.

または、再帰なしで、このプログラムを簡単な方法で書くにはどうすればよいですか?

4

4 に答える 4

2

このプログラムでは、戻りメカニズムはまったく正常に機能します。複数の return ステートメントがどのように関数からの 1 つの戻り点に解決されるかを理解するには、その方法whileif...else作業を学ぶ必要があります。

という2つの考えを分けてみることをお勧めします

  • 関数の単一インスタンスの実行。
  • 自分自身を呼び出す関数の再帰的な性質。

ステートメント

return anyfunc();

は、コード パスで検出された単一のリターン ポイントです。別の関数を呼び出し、その関数が返すものを返します。if ... else ...は 2 つの下位ステートメントの 1 つだけを実行するため、2 つの return のうちの 1 つだけが呼び出されます。最後の 1 つは、ループの初期条件が false であったため、ループに入らなかったケースをキャッチします。

再帰的な問題はワームの別の缶詰ですが、上記を明確にする必要があります。そうしないと、再帰によってどうしようもなく混乱することになります。:(

于 2013-08-12T16:34:12.420 に答える
0

おそらくもう少し明確です:

int findgcd(int x,int y)
{
 if(x!=y)
 {
  if(x>y)
  {
   return findgcd(x-y,y);
  }
  else
  {
   return findgcd(x,y-x);
  }
 }
 return x;
}
于 2013-08-12T16:38:08.503 に答える
0
return findgcd(x, y-x);

は次と同じです:

int t = findgcd(x, y-x);
return t;

値が 1 つしか返されないことがお分かりいただけると思います。

于 2013-08-12T16:38:18.193 に答える
0

return findgcd(var1,var2)再帰的です。findgcd()条件文whileが真でなくなるまで自分自身を呼び出し続けます-これは実際には正しくありませんif. . true でない場合は、入力されたパラメーターを返しますx。が返されると、ヒットxするまでスタックが解き放たれます。gcd=findgcd(n1,n2);

于 2013-08-12T16:38:18.290 に答える