Локон с функцией SQL SERVER

Хороший день нуждался в том, чтобы сделать функцию, которая звонила бы в функцию Factorial и делала следующий sumatoria.

e=1 + (1/1!) + (1/2!) + (1/3!) + (1/n!)

CREATE FUNCTION Factorial (@a int)
RETURNS INT 
AS
BEGIN
DECLARE @i INT

IF @a <= 1
    SET @i =1 
else
    set @i = @a * dbo.Factorial(@a-1)
return @i
end

select dbo.Factorial(11) 'Numero facotrial'


CREATE FUNCTION examen(@a int)
RETURNS FLOAT 
BEGIN 
    DECLARE @b float, 
            @c float;
    SET @c = (SELECT dbo.Factorial(@a))
    WHILE(@b <= @c)
    BEGIN
        SET @b = 1 / @c
    END 

    SET @b = @b + 1
    RETURN @b
END
GO

SELECT dbo.examen(10)
0
задан 04.11.2019, 20:34
1 ответ

Чтобы начинаться, у тебя есть несколько проблем в ней definiciГіn. Эта funciГіn не вычисляет factorial, а сумму обратных factoriales. TambiГ©n неправильный, что ты старался возвращать целое число, когда всегда regresarГЎs что-то меньшее в 3 и большую часть времени serГЎ превосходящий 2.

, Сказанные это, ты не нуждаешься в том, чтобы использовать возврат. Это tambiГ©n prevendrГЎ ошибки, прибыв в lГ-mite из укрытых процессов SQL Server. SГіlo ты нуждаешься в WHILE с какими-то переменными.

CREATE FUNCTION SumaInversoFactorial (
    @a int
)
RETURNS FLOAT 
AS
BEGIN
    DECLARE @i int = 1,
            @r float = 1,
            @f float = 1;

    WHILE @i <= @a
        SELECT @r = @r + 1/(@i*@f),
               @f = @i * @f,
               @i = @i + 1;


    RETURN @r;
END;
GO

SELECT dbo.SumaInversoFactorial( 11);

GO
DROP FUNCTION dbo.SumaInversoFactorial;

, Если хочется делать с 2 функциями, идеальное состоит в том, чтобы делать одну для factorial любой nГєmero и другая, чтобы пробегать серию. Это плохая идея, потому что мы будем делать 2 цикла вместо одного, что подразумевает mГЎs работу и меньше, эффективность.

CREATE FUNCTION Factorial (@a int)
RETURNS int 
AS
BEGIN
DECLARE @f int = 1;

WHILE @a >= 1
    SELECT @f = @f * @a,
           @a -= 1;

RETURN @f;
END
GO
CREATE FUNCTION SumaInversoFactorial2 (@a int)
RETURNS TABLE 
AS
RETURN
WITH 
E(n) AS(
    SELECT n FROM (VALUES(0),(0),(0),(0),(0),(0),(0),(0),(0),(0))E(n)
),
E2(n) AS(
    SELECT a.n FROM E a, E b
),
E4(n) AS(
    SELECT a.n FROM E2 a, E2 b
),
cteTally(n) AS(
    SELECT TOP(@a) ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) n
    FROM E4
)
select 1 + SUM( CAST( 1 AS float) / dbo.Factorial(n)) 'Numero Factorial'
FROM cteTally;

GO

SELECT *
FROM dbo.SumaInversoFactorial2(5) sif;

GO
DROP FUNCTION Factorial, SumaInversoFactorial2;
1
ответ дан 01.12.2019, 12:49
  • 1
    Я понимаю, что стоимость, должно быть, меньше в 3, но функция Factorial, которую я сделал одинокой, делает вычисление factorial число n, я нуждаюсь в двух функциях, сначала та, которую вычисляет factorial и после одна, которая вычисляла бы суммы euler используя в функцию factorial – Arturo Ortiz Vázquez 04.11.2019, 18:34
  • 2
    ¿ Из-за qué ты нуждаешься в двух функциях, если ты можешь использовать только одну? – Luis Cazares 04.11.2019, 18:43
  • 3
    Который может делаться только в одной, но они просят у меня, что использовались 2 :( – Arturo Ortiz Vázquez 04.11.2019, 19:27
  • 4
    Попробуйте делать это, но он посылает меня как результат NULL – Arturo Ortiz Vázquez 04.11.2019, 19:32

Теги

Похожие вопросы