2016-01-09 2 views
2

Ceci est mon code.la fonction n'est pas retournée à une déclaration de retour correcte pour certains cas de test

Problème: Je reçois une sortie incorrecte pour le scénario de test: a = 100 b = 54.

problème Trouvé: Pourquoi est-ce que lorsque la première condition if dans la méthode computeGcd est invoquée (lorsque a==b ou a est divisible par b) qu'il ne revient pas de ce si le bloc de retour à la ligne dans la principale méthode d'où elle a été appelée?

Au lieu de cela, il va à la dernière déclaration de retour dans la méthode et il retourne l'ancienne valeur de 'b' à partir de là. Qu'est-ce que je rate?

public static void main(String[] args) { 
    Scanner sc = new Scanner(System.in); 
    int a = sc.nextInt(); 
    int b = sc.nextInt(); 
    if (a >= b) { 
     System.out.println("\n\nfinal values are: " + computeGcd(a, b) 
       + " for a is=" + a + " and b=" + b);} 
    else 
     System.out.println(computeGcd(b, a)); 
    sc.close(); 
} 

public static int computeGcd(int a, int b) { 
    System.out.println("out side a is=" + a + " and b=" + b); 
    if (a == b || a % b == 0) { 
     System.out.println("Inside final : a is=" + a + " and b=" + b); 
     return b; 
    } else { 
     a = (a - b * (a/b)); 
     if (a > b) { 
      System.out.println("Inside test a>b : a is=" + a + " and b=" + b); 
      computeGcd(a, b); 
     } 
     if (b > a) { 
      System.out.println("Inside test a<b : a is=" + a + " and b=" + b); 
      computeGcd(b, a); 
     } 
    } 
    System.out.println("exiting else"); 
    System.out.println("i m here :P "); 
    return b; 
} 

débogage pour le cas de test: 100 54

+0

Vous nous demande de débogage ou vous avez déjà débogué? – SMA

+0

J'ai déjà fait cela.J'ai juste laissé tous ces sysouts juste au cas où quelqu'un essaie le code, alors ce sera plus facile pour eux. – Ronald

Répondre

1

Vos appels récursifs ne le font pas return.

if (a > b) { 
    System.out.println("Inside test a>b : a is=" + a + " and b=" + b); 
    return computeGcd(a, b); // <-- add return 
} else { // if (b > a) { 
    System.out.println("Inside test a<b : a is=" + a + " and b=" + b); 
    return computeGcd(b, a); // <-- add return 
} 

Vous pouvez également

Le plus grand GCD possible est la racine carrée du minimum des deux termes. Vous pouvez commencer avec cette valeur et revenir en arrière. Quelque chose comme,

public static int computeGcd(int a, int b) { 
    if (a == b) { 
     return a; 
    } 
    for (int i = (int) Math.sqrt(Math.min(a, b)); i >= 2; i--) { 
     if (a % i == 0 && b % i == 0) { 
      return i; 
     } 
    } 
    return 1; 
} 

qui retourne 2 (pour 100, 54) parce que la moitié de 54 est 27 qui est 3 laissant les seuls dénominateurs communs étant 2 et 1.

+0

Merci, ça fonctionne. Mais je voulais juste demander deux choses 1. Pourquoi devrais-je utiliser des déclarations de retour dans les appels récursifs. Je suis seulement obligé d'appeler à nouveau la fonction afin que je puisse juste écrire les noms de fonction avec les entrées. 2.Why est la valeur de b en imprimant l'ancienne valeur dans mon code. Mais merci pour votre réponse. Mon cide fonctionne correctement mais j'ai encore ces doutes si vous pouvez aider :) – Ronald

+0

Je voudrais clarifier mon code s'il vous plaît :) Je suis effectivement absent sur un concept lié aux appels récursifs si vous pouvez m'aider avec cela. – Ronald

+0

Lorsque vous vous recurerez, vous invoquerez de nouveau la méthode (avec une nouvelle pile d'appels); c'est pourquoi vous devez capturer (ou renvoyer) le résultat (c'est un nouvel appel, avec de nouvelles variables locales). –