PostgreSQL 实现阶乘方法列举

13 篇文章 0 订阅
7 篇文章 0 订阅
PostgreSQL 功能庞大,对实现乘法这类运算有诸多的方法,今天我来简单列举下以下几种便捷的途径。

比如我们要计算10!


1、 可以用SQL给它展开:
t_girl=# select 1*2*3*4*5*6*7*8*9*10 as mutiply_10;    
 mutiply_10 
------------
    3628800
(1 row)


Time: 0.854 ms




2、 用WITH递归
t_girl=# with recursive g(m,n) as 
t_girl-# (select 1 m, 10 n
t_girl(# union all
t_girl(# select m*n, (n-1) n from g where n > 1
t_girl(# )
t_girl-# select max(m) as factorial_10 from g;
 factorial_10 
--------------
      3628800
(1 row)


Time: 3.893 ms




3、 用简单的函数来展开
create or replace function func_get_factorial(
f_number int
)  returns bigint 
as 
$ytt$
  declare i int :=1;
  declare v_result bigint := 1;
begin
  for i in 1 .. f_number loop
    v_result := v_result * i;
  end loop;
  return v_result;
end;
$ytt$ 
language plpgsql;


t_girl=# select func_get_factorial(10) as factorial_10;
 factorial_10 
--------------
      3628800
(1 row)


Time: 1.022 ms




4、 用游标和序列函数generate_series来展开
create or replace function func_get_factorial2(
f_number int
)  returns bigint 
as 
$ytt$
  declare cs1 cursor for select n from generate_series(1,f_number,1) as g(n);
  declare v_result bigint := 1;
  declare v_n bigint := 0;
begin
    open cs1;
    loop
        fetch cs1 into v_n;
        exit when not found;
	v_result := v_result * v_n;
    end loop;
    close cs1;
  return v_result;
end;
$ytt$ 
language plpgsql;


t_girl=# select func_get_factorial2(10) factorial_10;
 factorial_10 
--------------
      3628800
(1 row)


Time: 2.238 ms
t_girl=# 





5、 用自定义python函数

create or replace function func_get_factorial_py(
f_number int
)  returns bigint 
as 
$ytt$
m = 1
n = 1
for i in range(1,f_number+1):
    m = m * i
n = m
return n
$ytt$ 
language plpythonu;


t_girl=# select func_get_factorial_py(10) factorial_10;
 factorial_10 
--------------
      3628800
(1 row)


Time: 1.060 ms




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值