Rekursion zum Erstellen einer Sum-Methode

7

Ich hatte das für eine Interviewfrage und ich konnte es nicht lösen. Ich habe gesessen und darüber nachgedacht, aber ich kann mir immer noch nicht vorstellen, wie ich es machen soll.

Ich habe 3 Methoden. Ich nehme an, dass zwei Zahlen durch Rekursion addiert werden, so dass ich keine arithmetischen Operatoren wie +, -, etc. Verwenden kann.

Die 3 Methoden sind Sum, Add1, Sub1.

Add1 nimmt 1 Integer als Parameter und gibt diese ganze Zahl mit einem Inkrement von 1 zurück. Sub1 macht dasselbe, aber dekrementiert 1.

Die Sum-Methode benötigt 2 ganze Zahlen und verwendet Rekursion, um die Summe der 2 ganzen Zahlen zurückzugeben. Zeigen Sie die Implementierung.

Außerdem können Sie mit der Sum-Funktion eine neue Funktion implementieren, die 2 ganze Zahlen als Eingabe verwendet und ihr Produkt mit Rekursion, aber ohne arithmetische Operatoren ausgibt?

In beiden Fällen sind die ganzen Zahlen nicht negativ.

    
Harris Calvin 01.11.2013, 14:38
quelle

6 Antworten

10
%Vor%     
Ulrich Horus 01.11.2013, 14:43
quelle
13

Dies ist in der Tat, wie natürliche Zahlenarithmetik von den ersten Prinzipien definiert wird; siehe Ссылка

Machen wir das von Grund auf, warum nicht wir?

  • Null ist ein natürlicher
  • Zero hat keinen Vorgänger
  • Jedes natürliche hat einen Nachfolger

Einfach gemacht:

%Vor%

Alles klar, wir können jede beliebige Integer darstellen. Jetzt, wie machen wir Addition? Wir definieren die Addition als:

%Vor%

Also fügen wir einen Operator hinzu

%Vor%

Alles klar, versuchen wir es.

%Vor%

Und da gehen Sie, zwei plus zwei sind tatsächlich vier.

Wenn dieses Thema Sie interessiert, führe ich derzeit eine lange Reihe auf meinem Blog über natürliche und ganzzahlige Arithmetik von Grund auf, obwohl ich eine binäre Darstellung anstelle einer unären Darstellung verwende. Siehe

Ссылка

Ganz allgemein: Die Frage soll testen, ob Sie die Grundstruktur einer rekursiven Methode kennen; vielleicht lässt du mich das nicht für dich auslegen. Rekursive Methoden in C # folgen alle diesem Muster:

  • Kennen wir die Lösung des Problems ohne Rekursion? Wenn ja, dann löse das Problem und gib das Ergebnis zurück.
  • Wir kennen die Lösung des Problems nicht. Brechen Sie das Problem in ein oder mehrere kleinere Probleme. Die Reduktion muss Probleme machen, die tatsächlich kleiner sind , das heißt näher an einem Problem, das eine bekannte Lösung hat . Andernfalls wird die Rekursion nicht beendet.
  • Löse jedes Problem rekursiv.
  • Kombinieren Sie die Lösungen mit diesen Problemen, um eine Lösung für das größere Problem zu finden.
  • Gib das Ergebnis zurück.

Das machen wir im Additions-Operator. Wir prüfen zuerst, ob wir die Lösung des Problems kennen; a + 0 ist ein. Wenn wir die Lösung des Problems nicht kennen, machen wir ein kleineres Problem; Wenn wir den Vorläufer des zweiten Summanden nehmen, sind wir einem Problem, das wir zu lösen wissen, einen Schritt näher.

    
Eric Lippert 01.11.2013 15:07
quelle
0

Hmm .. versuchen sie schlechte Programmierer einzustellen? In jedem Fall könnte getan werden, indem die Funktion sum seine zweiten Argumente nimmt, add / decrement 1 und sich selbst aufruft.

%Vor%     
evolvedmicrobe 01.11.2013 14:50
quelle
0

Ich hasse diese Art von Interviewfragen, weil ich sie unter den damit verbundenen Zwängen eines Interviews sehr schwer beantworten kann.

Hier ist Add1, Sub1, Sum, Product alles ohne formale Verwendung des + oder - Symbols gemacht.

%Vor%     
Dweeberly 01.11.2013 15:17
quelle
0

Rekursive Funktion Sum :

%Vor%

Und Prod :

%Vor%     
Floris 01.11.2013 14:44
quelle
0

Sie können diese Klasse einfach auf einfache Weise implementieren und sie wird für jeden Typ T funktionieren.

%Vor%

Also für Ints (oder wahrscheinlich uints) würde es ungefähr so ​​sein:

%Vor%     
Rodrick Chapman 01.11.2013 16:07
quelle

Tags und Links