2010-04-30 2 views
1

J'ai écrit ce code python, qui de wolfram alpha dit qu'il est censé retourner le factoriel de toute valeur positive (j'ai probablement foiré quelque part), entier ou non:comment quitter la formule mathématique récursive et toujours obtenir une réponse

from math import * 

def double_factorial(n): 
    if int(n) == n: 
     n = int(n) 
     if [0,1].__contains__(n): 
      return 1 
     a = (n&1) + 2 
     b = 1 
     while a<=n: 
      b*=a 
      a+= 2 
     return float(b) 
    else: 
     return factorials(n/2) * 2**(n/2) *(pi/2)**(.25 *(-1+cos(n * pi))) 

def factorials(n): 
    return pi**(.5 * sin(n*pi)**2) * 2**(-n + .25 * (-1 + cos(2*n*pi))) * double_factorial(2*n) 

le problème est, dire que je entrée pi à 6 décimales. 2 * n ne deviendra pas un flotteur avec 0 comme décimales dans un proche avenir, de sorte que l'équation se révèle être

pi**(.5 * sin(n*pi)**2) * 2**(-n + .25 * (-1 + cos(2*n*pi))) * double_factorial(loop(loop(loop(...))))) 

comment pourrais-je arrêter la récursivité et toujours obtenir la réponse? Ive avait des suggestions pour ajouter un index aux définitions ou quelque chose, mais le problème est que si le code s'arrête quand il atteint un index, il n'y a toujours pas de réponse à remettre dans les "nids" précédents ou quoi que vous appeliez les

+0

peut-être fournir un lien vers la page Alpha Wolfram vous faites référence? –

+0

suffit d'aller à wolframalpha.com et tapez, disons, pi! et il vous donnera 7,1880827289760327020821943451247587185593017639684371624100 ... – calccrypto

Répondre

0

dans votre code, vous définissez double_factorial comme

double_factorial(n) = factorial(n/2) * f(n)  ... (1) 

et dans le factoriel vous définissez comme

factorial(n) = double_factorial(2*n)/f(2*n) ... (2) 

qui équivaut à équation (1), vous avez donc créé une référence circulaire sans point de sortie. Même les mathématiques ne peuvent pas aider. Vous devez définir factorielle ou factorielle double, par ex.

def factorials(n): 
    return tgamma(n + 1) 
+0

je pensais que beaucoup ... alors comment Wolfram Alpha faire? – calccrypto

+0

@calccrypto: Wolfram Alpha est basé sur Mathematica qui peut résoudre les équations symboliquement. Vous ne pouvez pas utiliser directement les techniques pour Mathematica en Python. – kennytm

1

Vous avez défini f en termes de g et g en termes de f. Mais vous n'avez pas seulement une définition circulaire sans point de départ pour commencer la récursion. Tu as quelque chose de pire. La définition de f est en réalité la définition de g inversée. f est justement défaire ce que g a fait et vice versa. Si vous essayez d'implémenter vous-même le gamma (c'est-à-dire ne pas utiliser celui qui est déjà présent dans les bibliothèques), vous devez utiliser une formule qui exprime le gamma en fonction de quelque chose que vous savez évaluer. Juste en utilisant une formule et son inversion comme cela est une méthode qui échouera pour presque n'importe quel problème que vous l'appliquez.

+0

je n'essaie pas de faire gamma. double factoriel est: entrée n. multiplier toutes les autres valeurs jusqu'à 2 ou 3, selon si la valeur est pair ou impair – calccrypto

+0

Si vous essayez de calculer factorielle double pour les nombres réels arbitraires vous de calculer statiquement gamma. (http://en.wikipedia.org/wiki/Gamma_function#Properties) Quels arguments attendez-vous de transmettre? Toute valeur flottante? Cela ne correspond pas à votre description de la multiplication de toutes les autres valeurs car pair ou impair ne s'applique pas aux nombres réels qui ne sont pas des nombres entiers. Si vous voulez utiliser cette formule que j'ai donné en termes de gamma, et que vous souhaitez mettre en œuvre gamma-vous, il y a un code dans la source pour libm. – sigfpe

Questions connexes