Factorial generalizado
El factorial generalizado de x respecto de y y z es el producto x(x-z)(x-2z) … (x-(y-1)z). Por ejemplo, el factorial generalizado de 7 respecto de 3 y 2 es 7x5x3 = 105 y el de 7 respecto de 2 y 3 es 7×4 = 28
Definir la función
1 |
factGen :: Integer -> Integer -> Integer -> Integer |
tal que (factGen x y z) es el factorial generalizado de x respecto de y y z. Por ejemplo,
1 2 |
factGen 7 3 2 == 105 factGen 7 2 3 == 28 |
Nota: Se supone que x, y y z son positivos y z < x.
Comprobar con QuickCheck que (factGen x x 1) es el factorial de x.
Soluciones
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
import Test.QuickCheck -- 1ª definición (por comprensión): factGen :: Integer -> Integer -> Integer -> Integer factGen x y z = product [x,x-z..x-(y-1)*z] -- 2ª definición (por recursión): factGen2 :: Integer -> Integer -> Integer -> Integer factGen2 x 1 _ = x factGen2 x y z = x * factGen2 (x-z) (y-1) z -- Propiedad de equivalencia prop_equiv :: Positive Integer -> Positive Integer -> Positive Integer -> Property prop_equiv (Positive x) (Positive y) (Positive z) = z < x ==> factGen x y z == factGen2 x y z -- La comprobación es -- λ> quickCheck prop_equiv -- +++ OK, passed 100 tests. -- La propiedad es prop_factGen :: Positive Integer -> Bool prop_factGen (Positive x) = factGen x x 1 == product [1..x] -- La comprobación es -- λ> quickCheck prop_factGen -- +++ OK, passed 100 tests. |
Solución en Maxima
1 |
factGen (x,y,z) := genfact (x,y,z)$ |
En realidad, la ecuación fact 0 = 1 es innecesaria. Podría simplificarse.
En Maxima está predefinido