11
votes

Récupération de séquence harmonique

Je reçois vraiment la suspension de la récursion (ou donc je pense), mais ce problème me trébuche. J'essaie de retourner 1 + 1/2 + 1/3 + ... + 1 / N, mais peu importe ce que j'essaie la méthode renvoie 1.0. Je ne peux pas pour la vie de moi comprendre ce qui ne va pas. XXX


5 commentaires

Avez-vous vérifié cela avec un débogueur étape par étape?


Utilisez des doubles dans vos calculs de division, c'est-à-dire (1.0 / N) .


Oui je l'ai fait. Il est difficile pour moi de suivre des problèmes de récursivité par le biais d'un débogueur, car il existe tant de niveaux qu'il est difficile de suivre ce qui se passe.


Vous voudrez peut-être aussi protéger contre la récursion infinie que vous obtiendrez si un numéro zéro ou négatif est transmis par erreur pour n .


Ouais, je ferais normalement le cas de base si (n <= 1) {, mais ceci est pour un système de soumission en ligne et pour une raison quelconque, il n'accepte que ce que j'ai actuellement.


8 Réponses :


13
votes

Vous voulez utiliser la division de points flottants: xxx

c'est: 1/2 est 0 ; 1 / 2.0 est 0.5 .


2 commentaires

Ah, cela fait partie du problème, mais j'ai également implémenté ma formule de manière incorrecte (il devrait être retour (1.0 / N) + harmonique (n-1); . Merci!


heureux d'avoir pu aider! Je cherchais seulement à souligner pourquoi vous receviez «0», et non rien au-delà de ce point. Brian est allé le mile supplémentaire



2
votes

C'est parce que la division entière donne un résultat entier.

donc, 1/2 == 0

Vous pouvez utiliser plutôt utiliser floating-point division comme ceci: - < Pré> xxx


0 commentaires

2
votes

Vous devez utiliser des doubles. En ce moment, vous faites 1/1 code>, qui sont tous deux entiers. Changez-le à:

return (1.0 / n) + (1.0 / harmonic(n - 1));


0 commentaires

1
votes

Utilisez des doubles dans vos calculs de division. Actuellement, tout est jeté sur INTS, perdant toute précision de points flottants que vous attendez normalement.

public static double harmonic(int n) {
    if (n == 1) {
        return 1;
    } else {
        return (1.0 / n) + (1.0 / harmonic(n - 1));
    }
}


0 commentaires

10
votes

Eh bien, pour un, vous ne voulez pas retourner (1 / n) + (1 / harmonique (n-1)) code>, mais aussi vous devez utiliser double Arithmétique:

public static double harmonic(int n) {
    if(n == 1) {
        return 1.0;
    } else {
        return (1.0 / n) + harmonic(n - 1);
    }
}


1 commentaires

C'est ça! D'autres ont suggéré d'utiliser des doubles, qui faisaient certainement partie du problème, mais vous avez également obtenu la correction dans la déclaration de retour . Merci!



0
votes

La partie de récursion ne doit pas inclure 1 / harmonique (n-1) il devrait être xxx


0 commentaires

0
votes
/**
 * Created by hrishikesh.mishra on 04/01/16.
 *
 * Describe a recursive algorithm
 * for computing the nth Harmonic number,
 * defined as Hn = ∑ n k=1 1/k.
 *
 */
public class HarmonicNumber {


    public static void main(String[] args) {

        System.out.println("Sum up to 1: "  + sum(1));
        System.out.println("Sum up to 2: "  + sum(2));
        System.out.println("Sum up to 3: "  + sum(3));
        System.out.println("Sum up to 4: "  + sum(4));
    }


    /**
     * Summation with recursive method.
     * @param n
     * @return
     */
    public static double sum(int n){
        if(n <= 1)
            return 1;
        else
            return ((double) 1/n) + sum(n - 1);
    }
}

0 commentaires

-1
votes
 public static double harmonic(int n)
   {
      if (n==1)
      return 1/n;
      else return 1/n + harmonic(n-1);
   }

2 commentaires

Veuillez fournir une explication à votre réponse uniquement à votre code.


Le cas de base est juste retour 1; depuis n == 1 et que vous faites 1/1 .