как выйти из рекурсивной математической формулы и получить ответ - PullRequest
1 голос
/ 01 мая 2010

я написал этот код на python, который из вольфрам альфы говорит, что он должен возвращать факториал любого положительного значения (я где-то ошибся), целое или нет:

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)

проблема, скажем, в том, что я ввожу пи в 6 десятичных знаков. 2 * n не станет плаванием с 0 в качестве десятичных дробей в ближайшее время, поэтому уравнение оказывается равным

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

как мне остановить рекурсию и получить ответ?

У меня были предложения добавить индекс к определениям или что-то в этом роде, но проблема в том, что, если код останавливается, когда достигает индекса, по-прежнему нет ответа, чтобы вернуться в предыдущие «гнезда» или как вы их называете

Ответы [ 2 ]

1 голос
/ 01 мая 2010

Вы определили f в терминах g и g в терминах f. Но у вас не просто круговое определение без базовой точки для начала рекурсии. У тебя что-то хуже. Определение f на самом деле является определением g в обратном порядке. f точно уничтожает то, что сделал g и наоборот. Если вы пытаетесь реализовать гамму самостоятельно (т.е. не используете ту, которая уже есть в библиотеках), тогда вам нужно использовать формулу, которая выражает гамму в терминах чего-то еще, что вы знаете, как оценить. Просто использование одной формулы и ее инверсия подобным образом - это метод, который потерпит неудачу практически при любой проблеме, к которой вы ее примените.

0 голосов
/ 01 мая 2010

В вашем коде вы определяете double_factorial как

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

и в факториале вы определяете его как

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

, что эквивалентно уравнению (1), поэтому вы создали круговую ссылку без точки выхода. Даже математика не может помочь. Вы должны определить факториал или double_factorial, например,

def factorials(n):
    return tgamma(n + 1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...