Additions mittels Rekursion

Status
Nicht offen für weitere Antworten.

Moviefreak

Mitglied
Hi,
ich bin Anfänger in Sachen Java-Programmierung und habe folgendes Problem:

Ich soll eine rekursive Methode schreiben, die zwei Zahlen mit einander addiert, ohne da man ein Additionszeichen benutzt. Allerdings ist eine Successorfunktion erlaubt.

Bis jetzt habe ich folgendes gemacht:
Java:
public class Aufgabe {
//Successor-Funktion
	public static int successor(int s){
		return s+1;
	}

//Addition zweier Zahlen - rekursiv
	public static int addition(int r,int s,int v){
		if (v == s){
			return r;
		}
		else {
			successor(r);
			successor(v);
			return addition(r,s,v);
		}
	}

public static void main(String[] args) {

//Zufallszahlen zwischen 1 und 50 in Array einlesen
		int n = 10 ;
		int array[] = new int[n];                            
		for (int i = 0; i < n; i++)                         
		   array[i] = (int)Math.floor((Math.random() * 50) + 1);

//Endrekursiv Ausgabe der Summe zweier Zahlen m>=0 und n>=0
int v = 0;
System.out.println("Summe rekursiv: "+ addition(r,s,v));
	}
}

Allerdings kommt es zu einem StackOverflow in der Methode addition, vielleicht kann mir da jemand helfen und sagen woran das liegt!

Vielen Dank im Voraus!
 

ttplayer

Aktives Mitglied
Wenn du zwei Zahlen addieren willst, warum übergibst du dann 3 Parameter?
Außerdem macht das
Java:
successor(v);
ja gar nichts, du musst den Rückgabewert schon abfangen.
 
Zuletzt bearbeitet:

Moviefreak

Mitglied
Gute Frage:) erschien mir dir einzige Lösung ,wenn man 2 Zahlen miteinander addieren soll ohne Addition benutzen zu dürfen. Quasi ein Variable die mitzählt und wenn man dann die eine Zahl so lange um 1 erhöht bis man die andere erreicht, sollte man doch auf das Ergebnis kommen. Für alternative Vorschläge bin ich natürlich offen.

THX ttplayer

Das hat mir sehr geholfen! Soweit habe ich mal wieder nicht gedacht.
 
Zuletzt bearbeitet:

ttplayer

Aktives Mitglied
Also, eine Zählervariable musst du doch nicht als Parameter übergeben:
Java:
public int add(int a, int b)
{
    for (int z = 0; z < b; z++)  a = successor(a);
    return a;
}
 

ttplayer

Aktives Mitglied
achso, rekursiv:
Java:
public int add(int a, int b)
{
    if(b > 0) return add(successor(a), --b);
    else return a;
}
 

Apokalypse

Mitglied
Ich weiß ja nicht,wieso so man so was Rekursiv lösen soll.
Aber ich wollte, mich auch mal dran versuchen:

Java:
 private static int add(int a,int b)
 {	
	if(b==0)
	    return a;
	return add( (a) - (-b),0);
 }

P.S Ich hoffe du meintest mit Additionszeichen nur Plus^^
 

Marco13

Top Contributor
P.S Ich hoffe du meintest mit Additionszeichen nur Plus^^

Java:
private static int add(int a,int b)
{	
    return a - (-b);
}
:toll: :D

Mal im ernst: Sowas wie x++ oder a-b oder so ist da eigentlich nicht. Mal mein Lösungsvorschlag - ein bißchen obfuskiert, aber garantiert +- und --frei :D
Java:
class RekursionAufgabe
{
    //Successor-Funktion
    public static int successor(int s){
        return s+1;
    }

    //Addition zweier Zahlen - rekursiv
    public static int addition(int a, int b)
    {
        return _(a,b,0,0,0);
    }

    public static int _(int _){return successor(_);}
    public static int _(int i, int í, int î, int ì, int l)
    {
        return i==î?í==ì?l:_(i,í,î,_(ì),_(l)):_(i,í,_(î),ì,_(l));
    }


    public static void main(String[] args) {

        System.out.println("Summe rekursiv: "+ addition(0,0));
        System.out.println("Summe rekursiv: "+ addition(1,0));
        System.out.println("Summe rekursiv: "+ addition(0,2));
        System.out.println("Summe rekursiv: "+ addition(23,19));
    }
}

EDIT: In der Hoffnung, dass in der Original-Aufgabenstellung von positiven Zahlen die Rede war - sonst müßte man das noch anpassen...
 

Ein Keks

Bekanntes Mitglied
man könnts auch so machen xD :
Java:
public class Test{
	public static void main(String[] args){
		Scanner scan = new Scanner(System.in);
		int i = scan.nextInt();
		int j = scan.nextInt();

		System.out.println(confusingAddition(i, j));
	}

	public static int confusingAddition(int a, int b){
		a = Integer.MIN_VALUE - (Integer.MAX_VALUE-a-b) - 1;
		return a;
	}
}
ok im endeffekt ist das nur a+b mit sinnlosen drumherum aber vielleicht fällst nicht auf xDD
 

Landei

Top Contributor
Einfach und ineffizient:

Java:
public class Addition {

    public static int succ(int n) {
        return n+1;
    }

    public static int pred(int n) {
        if (n == 0) throw new IllegalArgumentException();
        return predHelp(0,n);
    }

    private static int predHelp(int k, int n) {
        return succ(k) == n ? k : predHelp(succ(k),n);
    }

    public static int add(int a, int b) {
        return a == 0 ? b : add(pred(a), succ(b));
    }

    public static void main(String[] args) {
        System.out.println(add(11,89));
    }

}
 

Marco13

Top Contributor
(So als Tipp: Meine Lösung ist ungefähr das, was rauskommt, wenn man alle Methoden von Landei's Lösung in eine einzige reinwurstet :D )
 

Landei

Top Contributor
We need no stinkin' ints:

Java:
public class AddNat {
   private static class Nat {
       private final static Nat ZERO = new Nat(null);
       private final Nat pred;
       public Nat(Nat pred) { this.pred = pred;  }
       public Nat succ(){ return new Nat(this); }
       @Override public String toString() {
           int i = 0;
           for(Nat n = this; n != ZERO; n = n.pred) {
               i++;
           }
           return "" + i;
       }
       @Override public boolean equals(Object o) {
           if(o instanceof Nat) {
               Nat that = (Nat) o;
               if(this == ZERO) {
                   return that == ZERO;
               } else {
                   return this.pred.equals(that.pred);
               }
           } else {
               return false;
           }
       }
   }

    public static Nat pred(Nat n) {
        if (n == Nat.ZERO) throw new IllegalArgumentException();
        return predHelp(Nat.ZERO, n);
    }

    private static Nat predHelp(Nat k, Nat n) {
        return k.succ().equals(n) ? k : predHelp(k.succ(), n);
    }

    public static Nat add(Nat a, Nat b) {
        return a.equals(Nat.ZERO) ? b : add(pred(a), b.succ());
    }

    public static void main(String[] args) {
        System.out.println(add(Nat.ZERO, Nat.ZERO));
        System.out.println(add(new Nat(Nat.ZERO),Nat.ZERO));
        System.out.println(add(Nat.ZERO, new Nat(new Nat(Nat.ZERO))));
        System.out.println(add(new Nat(new Nat(new Nat(Nat.ZERO))),new Nat(new Nat(Nat.ZERO))));
    }

}
 

Apokalypse

Mitglied
So, ich fand die Sache jetzt so spannend.
Dass, ich ein Volladdierer implementiert habe, der nutzt garantiert keine Aritmetik mittels +/-.. Operator.
Die Addition wird mit Logischer Algebra implementiert. Man kann an einem Volladdierer sehr gut erkennen wie eine CPU 2 Zahlen addiert.
In der Realität ist das eine, Sammlung aus Transistoren welches die logischen Operatoren übernehmen aber in hier sollte ein Software Lösung als Veranschaulichung genügen.

So damit ich auch mal posen kann:

Java:
/**
 * Implementierung eines Volladdierers
 * @author Apokalypse
 * @version 20 November 09
 */

/**
 * Implementierung eines Volladdierers
 */
public class VollAddierer {

    public static void main(String[] args) {
    	//Teste die Addition/Subtraktion:
    	VollAddierer calc = new VollAddierer();
    	long a = 2;
    	long b = 6;
    	long result = calc.add(a,b);
 
    	if(a+b == result)
    		System.out.println("Volladdierer: " + a +" + "+ b + " = " + result);
    	else
    		System.out.println("Volladdierer: " + a +" + "+ b + " != " + result + " => " + (a+b));
    	
    	a = 5;
    	b = 6;
    	result = calc.sub(a,b);
    	if(a-b == result)
    		System.out.println("Volladdierer: " + a +" - "+ b + " = " + result);
    	else
    		System.out.println("Volladdierer: " + a +" - "+ b + " != " + result + " => " + (a-b));
    }
    /**
     *  Standard Konstruktor
     */
    public VollAddierer(){};
    

    /**
     *  Addition mittels Logischer Algebra </br>
     *  Vorgehensweise, wie beim Volladdierer
     * @param a Zahl a
     * @param b Zahl b
     * @return a+b
     */
    public long  add(long a,long b) 
    {	
    	return addImpl(a,b,false,(byte)0,0);
    }
    
    /**
     * 
     *  Subtraktion mittels Logischer Algebra </br>
     *  Vorgehensweise, wie beim Volladdierer 
     * @param a Zahl a
     * @param b Zahl b
     * @return a-b
     */
    public long sub(long a,long b)
    {	
    	return addImpl(a,-b,false,(byte)0,0);
    }
    /**
     * Implementierung der Addition mittels Logischer Algebra</br>
     * In Form einer Rekursiven Funktion.
     * @param a Zahl a
     * @param b Zahl b
     * @param carryBit Übertragsbit
     * @param stelle Index des ersten Bits => 0
     * @param result initial Wert für das Ergebnis
     * @return a+b
     */
    private long addImpl(long a,long b,boolean carryBit,byte stelle,long result) throws IllegalArgumentException
    {	
    	
    	if(a==0)
    		return b;
    	if(b == 0)
    		return a;
    	//Stelle wurde korrekt gesetzt?
    	if(result == 0)
        	checkStelleValue(stelle,true);
    	// Alle Bits gesetzt?
    	if(stelle==Integer.SIZE)
    		return result;
    	
    	//Bits an stelle x ermitteln 
    	boolean aBit = getBit(a,stelle);
    	boolean bBit = getBit(b,stelle);
    	//Brechnen des Binären Addition, beachtung des CarrayBits
    	boolean resultBit = aBit ^ bBit ^ carryBit;
    	//Übertrag berechnen
    	carryBit = (aBit & carryBit) | (bBit & carryBit) | (aBit & bBit);
    	//ResultBit setzen und BitStelle 
    	return addImpl(a,b,carryBit,(byte)( stelle+1 ),setBit(result, resultBit, stelle));
    	
    }
    /**
     *  Gibt den Wert, eines Bits, einer Zahl zurück</br>
     * @param Zahl
     * @param stelle Position des gewünschten Bits
     * @return Bit Wert
     */
    public boolean getBit(long zahl,byte stelle) throws IllegalArgumentException
    {
     long indicatorBit = calcIndicatorBit(stelle);
	 return ((zahl & indicatorBit) == indicatorBit? 1:0) == 1;
    }
    /**
     *
     * Setzt den Wert, eines Bits, einer Zahl</br>
     * @param zahl Zahl
     * @param bit Wert des Bits
     * @param stelle Position des gewünschten Bits
     * @return geänderte Zahl
     */
    public long setBit(long zahl,boolean bit,byte stelle) throws IllegalArgumentException
    {
    	long indicatorBit = calcIndicatorBit(stelle);
    	if(bit)
    		zahl |= indicatorBit;		// 1 setzen
    	else
    		zahl &= ~indicatorBit;		// 0 setzen
    	return zahl;
    }
    /**
     * Gibt eine Zahl zurück bei dem, nur das Bit an der Position <i>stelle</i> gesetzt ist.</br>
     * @param  Position des gesetzten Bits
     * @return Zahl mit gesetztem Bit, an Position  <i>stelle</i> 
     */
    public long calcIndicatorBit(byte stelle) throws IllegalArgumentException
    {	
    	checkStelleValue(stelle,false);
    	//Berechnen des IndexBits: 0001 <-stelle 1, 0010 <-stelle 2,0100 <-stelle 3,...
    	return  1<<stelle;
    }
    
    private void checkStelleValue(byte stelle,boolean startAdd) throws IllegalArgumentException
    {
    	if(stelle<0 || stelle > Long.SIZE)
    		if(startAdd)
    		   throw new IllegalArgumentException("'stelle' expect a value equals 0");	
    		else
    		   throw new IllegalArgumentException("'stelle' expect a value between 0 and " + Long.SIZE);
    }
    
}
 
Zuletzt bearbeitet:
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Fehler bei simpler additions GUI Java Basics - Anfänger-Themen 2
Z Taschenrechner - Additions/Substraktions/Multiplikations/Divionsketten! Java Basics - Anfänger-Themen 4
G PRoblem mit rekursiver float additions methode Java Basics - Anfänger-Themen 9
E Reihenfolge der Werte umdrehen (mittels statischem int-Array Java Basics - Anfänger-Themen 3
M Anzahl Kommandozeilenparamter mittels Methode Java Basics - Anfänger-Themen 11
B Race Condition mittels Semaphore verhindern Java Basics - Anfänger-Themen 13
B Dom Manipulationen mittels Java Java Basics - Anfänger-Themen 8
ravenz Schleife mit for über String Array „zahlen“und prüfen ob Wert „a“ oder „b“ oder „c“ entspricht (mittels || ) Java Basics - Anfänger-Themen 4
D Gerade oder ungerade Zahl mittels Methoden Java Basics - Anfänger-Themen 13
Fats Waller Compiler-Fehler Kann ich einen String und die Summe zweier Char Werte mittels der println Anweisung ausgeben Java Basics - Anfänger-Themen 4
P9cman Vokale in einem String überprüfen mittels Rekursion Java Basics - Anfänger-Themen 8
Poppigescorn Arrayliste Mittels Scanner erweitern Java Basics - Anfänger-Themen 6
TimoN11 Quadratwurzel mittels Funktionswert der Quadratfunktion Java Basics - Anfänger-Themen 9
Khaled-Abo Ziffern unterscheiden mittels einer For-Schleife Java Basics - Anfänger-Themen 6
L Quadratwurzelrechnung mittels Heron-Verfahren Java Basics - Anfänger-Themen 6
P Klassenübergreifende Ausgabe mittels "getter" nicht möglich Java Basics - Anfänger-Themen 21
M Objekte mittels equals vergleichen Java Basics - Anfänger-Themen 14
I csv auslesen, mittels List Java Basics - Anfänger-Themen 18
V Erste Schritte Potenzen b^n mittels Schleife ermitteln Java Basics - Anfänger-Themen 7
S XML mittels HTTP Get Anfrage Java Basics - Anfänger-Themen 4
W Teilstring durch Teilstring mittels StringBuilder ersetzen Java Basics - Anfänger-Themen 7
P Liste mit Lücken mittels Filter aggregieren Java Basics - Anfänger-Themen 7
M Methoden Mittelwert rationaler Zahlen mittels Methode Java Basics - Anfänger-Themen 4
P Klassen In einer Autoklasse das Objekt Auto mittels Collection Speichern Java Basics - Anfänger-Themen 4
M Fibonacci rekursiv mittels Cache Java Basics - Anfänger-Themen 17
K Methoden Zahlensysteme umwandeln mittels Rekursion Java Basics - Anfänger-Themen 5
S int-Array mittels Arrays.sort() in einer Schleife sortieren. Java Basics - Anfänger-Themen 2
A JavaScript Object Notation einbinden mittels Maven Java Basics - Anfänger-Themen 7
L Liste mittels Stack implementieren Java Basics - Anfänger-Themen 0
J OOP GUI-Einstellungen mittels Preferences Java Basics - Anfänger-Themen 0
J ComboBox mittels neuer Methode befüllen Java Basics - Anfänger-Themen 3
A Android-Lib: Sourcecode Generator mittels Annotation Processing Java Basics - Anfänger-Themen 0
W Erste Schritte Exceltabelle in Datenbank übertragen mittels XDEV Java Basics - Anfänger-Themen 7
L Histogram mittels Schleifen und Arrays Java Basics - Anfänger-Themen 9
S Klassen Tiefe Kopie mittels Kopierkonstruktor Java Basics - Anfänger-Themen 6
S Columnindex mittels Columnname herrausfinden Java Basics - Anfänger-Themen 6
M Explorer oeffnen mittels java.awt.Desktop Java Basics - Anfänger-Themen 18
Dogge URL-Ausgabe/Verarbeitungsproblem mittels einer Applikation Java Basics - Anfänger-Themen 2
H Methoden Array aus Punkten erzeugen, mittels Punkt-Klasse Java Basics - Anfänger-Themen 5
S Dateien mittels Path(s) kopieren und umbenennen. Java Basics - Anfänger-Themen 4
C Dynamische (AJAX) Inhalte einer Webseite mittels Java auslesen Java Basics - Anfänger-Themen 2
N Mittels For Schleife Klasse erzeugen Java Basics - Anfänger-Themen 32
B Abfrage mittels Variable vereinfachen Java Basics - Anfänger-Themen 6
D Klassen Zeichnen von Figuren mittels vorgegebener Klasse Java Basics - Anfänger-Themen 3
P Collatz-Folge mittels indirekter Rekursion Java Basics - Anfänger-Themen 8
J Wurzelberechnung (mittels Newton) Java Basics - Anfänger-Themen 14
B Lotto mittels TreeSet Java Basics - Anfänger-Themen 3
C Vererbung "extends" umgehen mittels Objekterzeugung?! Java Basics - Anfänger-Themen 29
A String mittels RegEx filtern Java Basics - Anfänger-Themen 13
U E-Mails mittels Java senden. Java Basics - Anfänger-Themen 2
J Aufruf von Funktionen in *.jar mittels Eclipse Java Basics - Anfänger-Themen 4
E PHP Datei mittels Java aufrufen? Java Basics - Anfänger-Themen 3
P Collections Queue mittels ArrayList Java Basics - Anfänger-Themen 2
F Substring mittels RegEx ermitteln/ersetzen? Java Basics - Anfänger-Themen 2
R 3 Datumsangaben sortieren mittels Switch Java Basics - Anfänger-Themen 9
J Arraylänge mittels "Array.getLength" bestimmen!? Java Basics - Anfänger-Themen 3
I Ascii Bild mittels Scanner einlesen Java Basics - Anfänger-Themen 9
K OOP Datenkapselung mittels private - length Attribut bei Array Java Basics - Anfänger-Themen 3
M Delphi-DLL mittels JNI aufrufen Java Basics - Anfänger-Themen 11
H .jar Consolenprogramm mittels Doppelklick starten Java Basics - Anfänger-Themen 2
S SQL Anweisung mittels PreparedStatement Java Basics - Anfänger-Themen 15
E Array mittels Methode umgekehrt ausgeben Java Basics - Anfänger-Themen 6
Binary.Coder Skalarprodukt mittels long und binärzahlen Java Basics - Anfänger-Themen 5
M Auf Java (Desktop) Applikation mittels Webseite zugreifen Java Basics - Anfänger-Themen 6
W Suche nach strings zwischen eckigen Klammern mittels regulärer Ausdrücke Java Basics - Anfänger-Themen 3
Gonzalez Eingabe des Benutzers mittels readLine()-Methode. Klappt in meinem Beispiel nicht! Java Basics - Anfänger-Themen 7
R JTextField mittels JButton in Konsole ausgeben Java Basics - Anfänger-Themen 2
Z Terminkalender mittels Klassen und Feldern Java Basics - Anfänger-Themen 2
M Benutzer löschen mittels Netbeans Java Basics - Anfänger-Themen 4
I (fremde) IP mittels Applet auslesen Java Basics - Anfänger-Themen 6
G Mittels Runtime prüfen ob ein Programm läuft? Java Basics - Anfänger-Themen 18
M MenuShortcut nur mittels Shift+Taste Java Basics - Anfänger-Themen 3
N einbinden von anderen klassen mittels import Java Basics - Anfänger-Themen 2
M Datei speichern mittels InputStream Java Basics - Anfänger-Themen 13
G Navigations mittels Applet Java Basics - Anfänger-Themen 3
M ArrayList sortieren mittels Comparator Java Basics - Anfänger-Themen 10
C Lösung einer Aufgabe mittels Iteration und Rekursion Java Basics - Anfänger-Themen 12
T Zugriff auf umgebendes Objekt mittels Objekt innerer Klasse Java Basics - Anfänger-Themen 2
K Java-Programm mittels Shell-Skript aufrufen Java Basics - Anfänger-Themen 3
L Vorhandene SVG mittels Batik anzeigen Java Basics - Anfänger-Themen 8
K Datum mittels Thread aktualisieren Java Basics - Anfänger-Themen 6
G mittels Parameter Variable identifizieren Java Basics - Anfänger-Themen 6
T Zeitmesser mittels Threads implementieren Java Basics - Anfänger-Themen 16
V Mittels Java Pfeile erstellen Java Basics - Anfänger-Themen 3
J mehrere JCheckBoxen mittels Schleife abfragen Java Basics - Anfänger-Themen 13
T Erstellen eines Steuerprogramms mittels if-anweisungen Java Basics - Anfänger-Themen 10
R Vector nach Teilzeichenkette durchsuchen (mittels regex) Java Basics - Anfänger-Themen 5
G Mittels RegExp "Variablen" extrahieren Java Basics - Anfänger-Themen 4
T Fernsteuerung mittels Sockets (Architektur okay?) Java Basics - Anfänger-Themen 4
H Subtraktion mittels Negierung auf Addition zurückführen Java Basics - Anfänger-Themen 4
G Objekte mittels Schleife anlegen und ansprechen Java Basics - Anfänger-Themen 8
A Programm mittels Konsole öffnen Java Basics - Anfänger-Themen 12
B Querverweise auf eine Hilfedatei mittels ?Button? Java Basics - Anfänger-Themen 4
E Methodenaufruf mittels variable? kA Java Basics - Anfänger-Themen 5
P Collection Vector speichern mittels Serialisierung? Java Basics - Anfänger-Themen 2
K Verstehe Rekursion nicht ganz Java Basics - Anfänger-Themen 7
P Frage zu Rekursion und Backtracking Java Basics - Anfänger-Themen 2
DiyarcanZeren Rekursion in Java Java Basics - Anfänger-Themen 5
M Variablen Rekursion mit 2 Parameteren Java Basics - Anfänger-Themen 4
sserio Rekursion größten Primfaktor finden funktioniert nicht Java Basics - Anfänger-Themen 8

Ähnliche Java Themen

Neue Themen


Oben