J'ai posé le problème de la séquence tribonatch en C ++ et le nombre d'appels de fonction lors de l'écriture avec une fonction de récurrence (python est également disponible)

introduction

Ceci est mon premier article. J'ai trouvé un article qui avait l'air intéressant, alors je l'ai essayé. J'ai essayé de résoudre le problème de la séquence Tribonacci avec Ruby (délai de 10 minutes) Pionnier

Ce que j'ai fait

・ Défi de 10 minutes avec C ++ (échec car le temps de calcul est trop long) ・ Défi de 30 minutes (clair) avec C ++ -À propos du nombre d'appels de fonction lors de l'écriture récursive (y compris l'implémentation python)

Défi de 10 minutes en C ++ (échec)

Tout d'abord, j'ai trouvé une méthode pour le faire de manière récursive et l'ai écrite telle quelle. Le point est de trouver le 50e de la séquence tribonacci dans le premier terme [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;
}

Oui, cela ne termine pas le calcul à l'heure de Matomo. Donc, je le réécris pour ne pas avoir à faire de calculs inutiles. À ce stade, 10 minutes s'étaient écoulées, le défi a donc échoué.

Défi de 30 minutes avec C ++ (effacer)

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;
}

Le traitement quand il est de 3 ou moins n'est pas bon, mais il peut être calculé en un instant. Le code sort de tri (1) à tri (50), mais il est toujours de 20 ms. Cela suffira.

Nombre d'appels de fonction lors de l'écriture récursive

Eh bien, quand je l'ai écrit récursivement, je comprends qu'il fait des calculs inutiles, mais comment le nombre d'appels à cette fonction augmente-t-il?

une formule tri_r nombre d'appels
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

Tu peux le voir. Le nombre d'appels est calculé par la séquence tribonacci du premier terme {1,1,1}. C'est naturel quand on y pense, mais c'est un fait intéressant.

J'ai essayé de mesurer le temps de calcul par récursif. Ramassez seulement là où il se termine avec un temps de calcul matomo (mesurez 10 fois et prenez la moyenne).

num temps(ms)
34 825.2
35 1524.2
36 2856.1

Aux points 34 à 36, le temps de calcul est d'environ 1,85 fois et 1,87 fois, respectivement. Et le nombre d'appels? Je l'ai écrit dans le Python auquel je suis habitué.

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

Ainsi, vous pouvez voir que le nombre d'appels de fonction est d'environ 1,84 fois pour chaque terme supplémentaire. La majeure partie de l'augmentation du temps de calcul équivaut à une surcharge d'appel.

en conclusion

C'était mon premier message, et c'était dans un état de Markdown ou de Nanisore. S'il vous plaît laissez-moi savoir si vous trouvez qu'il est plus facile à lire si vous l'écrivez comme ça. Je suis encore nouveau dans la programmation et le codage, mais c'est amusant de résoudre ces problèmes et de les vérifier de différentes manières. Merci pour la lecture.

Recommended Posts

J'ai posé le problème de la séquence tribonatch en C ++ et le nombre d'appels de fonction lors de l'écriture avec une fonction de récurrence (python est également disponible)
[Homologie] Comptez le nombre de trous dans les données avec Python
J'ai aussi essayé d'imiter la fonction monade et la monade d'état avec le générateur en Python
Comment résoudre le problème de l'échec de la construction lorsque CI / CD de Python Function avec AWS Amplify
Je souhaite résoudre le problème de fuite de mémoire lors de la sortie d'un grand nombre d'images avec Matplotlib
[Python] Calculez le nombre de chiffres requis lors de la saisie de 0 [Note]
Retrouvez les termes généraux de la séquence de Tribonacci en algèbre linéaire et Python
[Python] Précautions lors de la recherche des valeurs maximum et minimum avec un tableau numpy avec un petit nombre d'éléments
J'ai installé Pygame avec Python 3.5.1 dans l'environnement de pyenv sur OS X
Rendre la bibliothèque créée par Eigen of C ++ disponible à partir de Python avec Boost.Numpy.
Ce que j'ai fait quand je suis resté coincé dans le délai avec lambda python
Définir la limite supérieure du nombre de répétitions de fonctions récursives en Python
Je veux obtenir le nom du fichier, le numéro de ligne et le nom de la fonction dans Python 3.4
Méthode Dyxtra: j'ai posé le problème d'AOJ avec Python en me basant sur le contenu de l'article de M. Kencho dans le numéro d'octobre de Software Design
Sortie du nombre de cœurs de processeur en Python
Récupérer l'appelant d'une fonction en Python
Calculez le nombre total de combinaisons avec python
Le 18ème problème d'écriture en temps réel hors ligne en Python
J'ai essayé d'implémenter la fonction gamma inverse en python
Le 19ème problème d'écriture en temps réel hors ligne en Python
[Python Data Frame] Lorsque la valeur est vide, remplissez-la avec la valeur d'une autre colonne.
Il est devenu TLE lorsque j'ai confirmé l'opération avec la fonction d'impression dans la compétition pro
Comment identifier l'élément avec le plus petit nombre de caractères dans une liste Python?
En voici une, je vais résumer les applications équipées "d'intelligence artificielle" qui m'intéressaient
[New Corona] Le prochain pic est-il en décembre? J'ai essayé l'analyse des tendances avec Python!
Comment compter le nombre d'occurrences de chaque élément de la liste en Python avec poids
Vérifiez le temps de traitement et le nombre d'appels pour chaque processus avec python (cProfile)
J'ai réfléchi à la raison pour laquelle Python self est nécessaire avec le sentiment d'un interpréteur Python
Lorsqu'une variable locale portant le même nom que la variable globale est définie dans la fonction
Le 15e temps réel hors ligne, j'ai essayé de résoudre le problème de l'écriture avec python
Vérifiez si la chaîne est un nombre en python
Comment obtenir le nombre de chiffres en Python
Obtenir la taille (nombre d'éléments) de Union Find en Python
Le 14ème problème de référence d'écriture en temps réel hors ligne avec Python
J'ai essayé de résoudre le problème avec Python Vol.1
J'ai essayé de résoudre le problème de F02 comment écrire en temps réel hors ligne avec Python
La valeur de meta lors de la spécification d'une fonction sans valeur de retour avec Dask dataframe s'applique
Lors de la lecture d'une image avec SimpleITK, il y a un problème s'il y a du japonais dans le chemin
La ventilation est importante. Ce que j'ai fait pour garder une trace de la concentration de C02 dans la pièce
J'ai écrit un doctest dans "J'ai essayé de simuler la probabilité d'un jeu de bingo avec Python"
Comment écrire quand on veut mettre un nombre après le numéro de groupe à remplacer par une expression régulière dans re.sub de Python
Exécutons Fusion 360 avec Python Partie 11 Puisqu'il n'y a aucun point le long du chemin dans l'API, j'ai pensé à une alternative
Je souhaite générer une sortie lors de la conversion de la valeur du type (par exemple, datetime) qui n'est pas pris en charge lors de la sortie de json avec python