0
votes

Fonction récursive ne fonctionne pas comme prévu

J'essaie d'écrire le code de fonction récursive qui imprime chaque puissance de 2 de 1 à N, n est l'argument de la fonction d'alimentation.

int powers(int n)  //here n=128 
{        
    if(n==2)
    {
        System.out.print(n);
    }        
    else if (n>2)  
    { 
        System.out.print(n +", ");   
        return powers(n/2); 
    } 
    System.out.println("");
    return 0;
} 


5 commentaires

Que se passe-t-il si vous appelez powers (n / 2) (vous n'avez pas besoin de le renvoyer) avant imprimer n , dans le < code> sinon si bloque?


J'essaie d'imprimer 2 ^ 1 = 2 - 2 ^ 7 = 128 C'est pourquoi essayer de faire des pouvoirs de retour (N / 2).


Mais la seule chose que votre méthode revient jamais est 0, ce n'est donc pas le qui compte, c'est l'ordre que vous imprimez des trucs. Vous imprimez le courant n avant tout le reste, mais vous avez impliqué que vous voulez l'imprimer après .


Alors, comment nous pouvons inverser cette commande? Comme nous pouvons obtenir n / 2 = 64 et ainsi de suite.


En faisant ce que j'ai suggéré dans mon premier commentaire.


3 Réponses :


2
votes

As que le but de votre fonction imprime les pouvoirs de 2, vous n'avez pas besoin de renvoyer la valeur. Par conséquent, vous pouvez réécrire votre fonction comme suit:

String powers(int N)  //here N=128 
{
    if(N==2){
        return (N + "");
    }
    String prev = powers(N/2); 
    return (prev + ", " + N);   
} 


1 commentaires

la fonction doit retourner entier



1
votes

Pourquoi faisons-nous l'hypothèse que l'entrée n est déjà une puissance de 2? En outre, 2 ^ 0 = 1, devrait aussi être dans le résultat aussi? XXX

Ceci fonctionne même si vous donnez 131 comme entrée.


1 commentaires

L'entrée pourrait également être négative, vous devez probablement faire votre premier si être <= .



1
votes

Je pense que ce serait un moyen plus élégant d'y parvenir. Les améliorations sont censées être:

  1. Utilisez le changement de bits lorsque cela est possible pour gagner Performance. Li>
  2. Fixez le placement des virgules pour tous les cas d'entrée N LI>
  3. Code de recherche plus élégant Li> ol>

    p>

    int powers(int N) //here N=128 
    {
      if (N < 2) return 0;
      powers(N >> 1); // Right shifting achieves division by 2 but a lot faster.
      if (N > 3) System.out.print(", "); // Fixing comma placement for all cases of N.
      System.out.print(N);
      return 0;
    }


0 commentaires