2010-12-23 4 views
0

Je dois calculer une somme de deux entiers en utilisant un algorithme récursif, mais sincèrement je n'ai aucune idée de la façon de le faire. Voici les conditions:Résumer des entiers récursifs avec Java

somme (x, y) =?
si x = 0 alors somme (x, y) = y autrement somme (x, y) = somme (prédécesseur (x), successeur (y)).

Est-ce que quelqu'un a une idée de comment je pourrais écrire cela dans un algorithme? Je serais heureux de tout conseil.

+2

vous avez l'algorithme juste là – Progman

+2

Pourquoi avez-vous répondu à votre question pendant que vous le demandiez? –

+2

note: cela ne fonctionne que si x n'est pas négatif. –

Répondre

7

Je ne vais pas vous donner le code puisque cela semble être un devoir, mais voici l'algorithme approximatif:

predecessor(x) = x - 1 
successor(x) = x + 1 

sum(x, y) = 
    if x = 0 
    then y 
    otherwise sum(predecessor(x), successor(y)) 
+0

Merci beaucoup. Je n'ai vraiment pas besoin du code. Je ne suis pas sûr de savoir comment écrire cet algorithme. Êtes-vous sûr que la définition du prédécesseur et du successeur est correcte? – Ordo

+1

@Ordo: écrivez le code et découvrez! ou exécutez simplement ce pseudo-code dans votre tête (ou sur papier). –

+1

Vous ne savez pas si nommer le paramètre "x" pour predecessor() et successor() est une bonne idée, pour un débutant ... –

1

Voici ma solution pour i & j deux> = 0. somme ensemble = 0 ; et soustraire 1 jusqu'à ce qu'il soit < = 0

public static int sum(int i, int j){ 
      return sum(i,j,0); 
} 

private static int sum(int i, int j, int sum) { 
    if (i <= 0 && j <= 0) { 
     return sum; 
    } else if (i <= 0) { 
     return sum(0, j - 1, sum + 1); 
    } else if (j <= 0) { 
     return sum(i - 1, 0, sum + 1); 
    } else { 
     return sum(i - 1, j - 1, sum + 2); 
    } 
} 

    public static void main(String[] args) { 
     System.out.println(sum(60, 7)); 

    } 
+3

Pourquoi si difficile? –

+0

@Martijn "la meilleure façon dont il est le moyen bien connu pour vous" :). ça vient d'abord à mon esprit et quelque chose de différent –

+0

C'est compliqué. L'algorithme donné par OP est plus simple. En outre, il laisse une marge d'erreur en fonction de l'utilisateur pour fournir 'sum' comme 0. –

1

C'est la plus simple que je pourrais immagine

public static void main(String[] args) { 
    System.out.println("4+5 = " + sum(4, 5)); 
    System.out.println("4+(-5) = " + sum(4, -5)); 
    System.out.println("-4+5 = " + sum(-4, 5)); 
    System.out.println("-4+5 = " + sum(-4, -5)); 
} 

public static int sum(int x, int y) { 
    if (x < 0) { 
     x *= -1; 
     y *= -1; 
    } 
    return (x == 0 ? y : sum(--x, ++y)); 
} 
+0

Pssst, jetez un oeil à * aioobe * solution ... –

+0

@ ring0: C'est pareil, juste que ça ne marchera pas avec les négatifs et ce n'est pas java – Hons

+0

ok, mon mauvais, je trouvé sa solution avec le 3-op plus simple ,, –

1

Code Javaish pseudo correspondant à votre code dans votre question

sum(x, y): return x == 0 ? y : sum(x-1, y+1) 

Works pour toute paire de nombres où x est un nombre entier non négatif.

+0

Pourquoi cela ne fonctionnerait-il pas si 'x == 0'? –

+0

Pourquoi cela ne fonctionnerait-il pas si 'x <0'? En Java, en utilisant 'int' –

+0

@ ring0, pour l'algoritm donné; un x négatif se recurverait en utilisant un x décrémenté qui ne deviendrait jamais 0, entraînant un débordement s'il ne sort pas de la pile en premier. – rsp

1

Pour gérer les nombres négatifs basés sur la réponse de @ aioobe.

sum(x, y): return x == 0 ? y : x < 0 ? ~sum(~x, -y) : sum(x-1, y+1) 

Remarque: l'utilisation plutôt optimiste de ~ pour éviter de sauter sur x = MIN_VALUE.