Ich habe nach dem Problem der Tribonatch-Sequenz in C ++ und der Anzahl der Funktionsaufrufe beim Schreiben mit einer Wiederholungsfunktion gefragt (Python ist ebenfalls verfügbar).

Einführung

Dies ist mein erster Artikel. Ich fand einen Artikel, der interessant aussah, also habe ich es versucht. Ich habe versucht, das Problem der Tribonacci-Sequenz mit Ruby zu lösen (Zeitlimit 10 Minuten) Pionier

Was ich getan habe

・ 10 Minuten Herausforderung mit C ++ (fehlgeschlagen, weil die Berechnungszeit zu lang ist) ・ 30 Minuten Herausforderung (klar) mit C ++ -Über die Anzahl der Funktionsaufrufe beim rekursiven Schreiben (einschließlich Python-Implementierung)

10 Minuten Herausforderung in C ++ (Fehler)

Zunächst habe ich mir eine Methode ausgedacht, um sie rekursiv zu machen, und sie so geschrieben, wie sie ist. Es geht darum, den 50. Teil der Tribonacci-Sequenz im ersten Term zu finden [1,3,7].

tribonacci_recursive.cpp


#include <iostream>
#include <chrono>
using namespace std;

long long tri_r(int num){
    if(num<=3){
        int templist[3] = {1,3,7};
        return templist[num-1];
    }
    else{
        return tri_r(num-1)+tri_r(num-2)+tri_r(num-3);
    }
}

int main(){
    chrono::system_clock::time_point  start, end;
    start = std::chrono::system_clock::now();
    cout << tri_r(51) << endl;
    end = std::chrono::system_clock::now();
    double e_time = std::chrono::duration_cast<std::chrono::milliseconds>(end-start).count();
    cout << e_time << " ms" << endl;
}

Ja, dies beendet die Berechnung nicht in Matomo-Zeit. Also schreibe ich es neu, damit ich keine unnötigen Berechnungen durchführen muss. Zu diesem Zeitpunkt waren 10 Minuten vergangen, sodass die Herausforderung fehlschlug.

30 Minuten Herausforderung mit C ++ (klar)

tribonacci.cpp


long long tri(int num){
    if(num<3){
        int templist[3] = {1,3,7};
        return templist[num-1];
    }
    else{
        long long tri_list[num] = {1,3,7};
        for(int i=3; i<num; i++){
            tri_list[i] = tri_list[i-1] + tri_list[i-2] + tri_list[i-3];
        }
        return tri_list[num-1];
    }
}
int main(){
    chrono::system_clock::time_point  start, end;
    start = std::chrono::system_clock::now();
    for(int i=1; i<51; i++){
        cout << i << "  " << tri(i) << endl;
    }
    end = std::chrono::system_clock::now();
    double e_time = std::chrono::duration_cast<std::chrono::milliseconds>(end-start).count();
    cout << e_time << " ms" << endl;
}

Die Verarbeitung bei 3 oder weniger ist nicht gut, kann aber sofort berechnet werden. Der Code wird von Tri (1) bis Tri (50) ausgegeben, beträgt jedoch immer noch 20 ms. Es wird genug sein.

Anzahl der Funktionsaufrufe beim rekursiven Schreiben

Nun, als ich es rekursiv schrieb, verstehe ich, dass es nutzlose Berechnungen durchführt, aber wie erhöht sich die Anzahl der Aufrufe dieser Funktion?

eine Formel tri_r Anzahl der Anrufe
tri_r(1) 1 1
tri_r(2) 1 1
tri_r(3) 1 1
tri_r(4) tri_r(1) + tri_r(2) + tri_r(3) = 1+1+1 3
tri_r(5) tri_r(2) + tri_r(3) + tri_r(4) =1+1+3 5
tri_r(6) tri_r(3) + tri_r(4) + tri_r(5) = 1+3+5 9

Du kannst es sehen. Die Anzahl der Anrufe wird durch die Tribonacci-Sequenz des ersten Terms {1,1,1} berechnet. Es ist natürlich, wenn Sie darüber nachdenken, aber es ist eine schöne Tatsache.

Ich habe versucht, die Berechnungszeit rekursiv zu messen. Nehmen Sie nur dort auf, wo es mit einer Matomo-Berechnungszeit endet (messen Sie 10 Mal und nehmen Sie den Durchschnitt).

num Zeit(ms)
34 825.2
35 1524.2
36 2856.1

In den Punkten 34 bis 36 beträgt die Berechnungszeit etwa das 1,85-fache bzw. das 1,87-fache. Wie wäre es mit der Anzahl der Anrufe? Ich habe es in dem Python geschrieben, den ich gewohnt bin.

tri_calc.py


def tri(num):
    ans_list = [1,1,1]
    if num > 3:
        for i in range(3, num):
            ans_list.append(ans_list[i-3] + ans_list[i-2] + ans_list[i-1])
    return ans_list

calc_num = tri(50)
print(calc_num[35]/calc_num[34])  #1.8392867552142929
print(calc_num[36]/calc_num[35])  #1.8392867552141035

Sie sehen also, dass die Anzahl der Funktionsaufrufe für jeden weiteren Begriff etwa 1,84-mal beträgt. Die Verlängerung der Berechnungszeit entspricht hauptsächlich dem Anrufaufwand.

abschließend

Es war mein erster Beitrag und er befand sich in einem Zustand von Markdown oder Nanisore. Bitte lassen Sie mich wissen, wenn Sie es leichter finden, wenn Sie es so schreiben. Ich bin noch neu in der Programmierung und Codierung, aber es macht Spaß, diese Probleme zu lösen und auf verschiedene Weise zu überprüfen. Danke fürs Lesen.

Recommended Posts

Ich habe nach dem Problem der Tribonatch-Sequenz in C ++ und der Anzahl der Funktionsaufrufe beim Schreiben mit einer Wiederholungsfunktion gefragt (Python ist ebenfalls verfügbar).
[Homologie] Zählen Sie mit Python die Anzahl der Löcher in den Daten
Ich habe auch versucht, die Funktionsmonade und die Zustandsmonade mit dem Generator in Python nachzuahmen
Wie man mit dem Problem umgeht, dass die Erstellung fehlschlägt, wenn CI / CD von Python Function mit AWS Amplify
Ich möchte das Problem des Speicherverlusts bei der Ausgabe einer großen Anzahl von Bildern mit Matplotlib lösen
[Python] Berechnen Sie die Anzahl der Stellen, die zum Ausfüllen von Nullen erforderlich sind. [Hinweis]
Finden Sie die allgemeinen Begriffe der Tribonacci-Sequenz in linearer Algebra und Python
[Python] Vorsichtsmaßnahmen beim Ermitteln der Maximal- und Minimalwerte mit einem Numpy-Array mit einer kleinen Anzahl von Elementen
Ich habe Pygame mit Python 3.5.1 in der Umgebung von pyenv unter OS X installiert
Stellen Sie die von Eigen of C ++ erstellte Bibliothek mit Boost.Numpy in Python zur Verfügung.
Was ich getan habe, als ich mit Lambda Python im Zeitlimit steckte
Legen Sie die Obergrenze für die Anzahl der Wiederholungen rekursiver Funktionen in Python fest
Ich möchte den Dateinamen, die Zeilennummer und den Funktionsnamen in Python 3.4 erhalten
Dyxtra-Methode: Ich habe das Problem von AOJ mit Python anhand des Inhalts von Kencho-sans Artikel in der Oktober-Ausgabe von Software Design gestellt.
Geben Sie die Anzahl der CPU-Kerne in Python aus
Holen Sie sich den Aufrufer einer Funktion in Python
Berechnen Sie die Gesamtzahl der Kombinationen mit Python
Das 18. Offline-Echtzeit-Schreibproblem in Python
Ich habe versucht, die inverse Gammafunktion in Python zu implementieren
Das 19. Offline-Echtzeit-Schreibproblem in Python
[Python Data Frame] Wenn der Wert leer ist, füllen Sie ihn mit dem Wert einer anderen Spalte.
Es wurde TLE, als ich den Vorgang mit der Druckfunktion im Competition Pro bestätigte
Wie identifiziere ich das Element mit der geringsten Anzahl von Zeichen in einer Python-Liste?
Hier ist eine, ich werde die mit "künstlicher Intelligenz" ausgestatteten Anwendungen zusammenfassen, an denen ich interessiert war
[New Corona] Ist der nächste Höhepunkt im Dezember? Ich habe die Trendanalyse mit Python versucht!
So zählen Sie die Anzahl der Vorkommen jedes Elements in der Liste in Python mit der Gewichtung
Überprüfen Sie die Verarbeitungszeit und die Anzahl der Aufrufe für jeden Prozess mit Python (cProfile).
Ich dachte darüber nach, warum Python selbst mit dem Gefühl eines Python-Interpreters notwendig ist
Wenn eine lokale Variable mit demselben Namen wie die globale Variable in der Funktion definiert ist
Beim 15. Offline-Echtzeitversuch habe ich versucht, das Problem des Schreibens mit Python zu lösen
Überprüfen Sie, ob die Zeichenfolge eine Zahl in Python ist
So ermitteln Sie die Anzahl der Stellen in Python
Ermitteln Sie die Größe (Anzahl der Elemente) von Union Find in Python
Das 14. Referenzproblem beim Offline-Schreiben in Echtzeit mit Python
Ich habe versucht, das Problem mit Python Vol.1 zu lösen
Ich habe versucht, das Problem von F02 zu lösen, wie man mit Python offline in Echtzeit schreibt
Der Wert von meta beim Angeben einer Funktion ohne Rückgabewert mit Dask dataframe gilt
Beim Lesen eines Bildes mit SimpleITK tritt ein Problem auf, wenn sich Japanisch im Pfad befindet
Belüftung ist wichtig. Was ich getan habe, um die CO2-Konzentration im Raum aufzuzeichnen
Ich schrieb einen Test in "Ich habe versucht, die Wahrscheinlichkeit eines Bingospiels mit Python zu simulieren".
So schreiben Sie, wenn Sie eine Zahl nach der Gruppennummer setzen möchten, die durch einen regulären Ausdruck in Python ersetzt werden soll
Lassen Sie uns Fusion 360 mit Python Part 11 ausführen. Da die API keinen Punkt auf dem Pfad enthält, habe ich mir eine Alternative überlegt
Ich möchte ausgeben, während der Wert des Typs (z. B. datetime) konvertiert wird, der bei der Ausgabe von json mit Python nicht unterstützt wird