--測試
<!-- [endif]-->
create
table
ta (
项目
varchar
(
20),
上级项目
varchar
(
20),
num int
)
insert
ta
select
'A'
,
''
,
100 union all
select
'B'
,
'A'
,
200 union all
select
'C'
,
'B'
,
300 union all
select
'D'
,
'B'
,
400 union all
select
'E'
,
'C'
,
500 union all
select
'F'
,
'D'
,
600 union all
select
'H'
,
'E'
,
700 union all
select
'G'
,
'F'
,
800
--
如果要显示上级的项目
:
create
function
roy_f(
@
项目
varchar
(
20))
returns
varchar
(
100)
as
begin
declare
@
上级项目
varchar
(
20)
select
@
上级项目
=
上级项目
from
ta where
项目
=
@
项目
return
case
when
@
上级项目
is
null
then
null
else
isnull
(
dbo.
roy_f(
@
上级项目
)+
'-'
,
''
)+
@
项目
end
end
--
如果显示各级项目的汇总金额
:
create
function
roy_f2(
@
项目
varchar
(
20))
returns
int
as
begin
declare
@tb table
(
项目
varchar
(
20),
上级项目
varchar
(
20),
num int
,
lev int
)
declare
@i int
,
@sum int
set
@i=
0
insert
@tb select
*,
@i from
ta where
项目
=
@
项目
while
@@rowcount
>
0
begin
set
@i=
@i+
1
insert
@tb
select
a.*,
@i
from
ta a,
@tb b
where
b.
项目
=
a.
上级项目
and
b.
lev=
@i-
1
end
select
@sum=
sum
(
num)
from
@tb
return
@sum
end
--
测试
:
select
项目
,
金额
=
dbo.
roy_f2(
项目
),
关系
=
dbo.
roy_f(
项目
)
from
ta
/*
项目
金额
关系
-------------------- -----------
---------------
A
3600
A
B
3500
A-B
C
1500
A-B-C
D
1800
A-B-D
E
1200
A-B-C-E
F
1400
A-B-D-F
H
700
A-B-C-E-H
G
800
A-B-D-F-G
(所影响的行数为
8
行)
*/
--
用存储过程统计
:
create
proc
roy_p @
项目
varchar
(
20)
as
begin
declare
@i int
set
@i=
0
select
*,
级数
=
@i into
#
from
ta where
项目
=
@
项目
while
@@rowcount
>
0
begin
set
@i=
@i+
1
insert
#
select
ta.*,
级数
=
@i
from
ta,
# b
where
ta.
上级项目
=
b.
项目
and
b.
级数
=
@i-
1
end
select
[sum]=
sum
(
num)
from
#
end
--
测试
:
exec
roy_p 'A'
/*
sum
-----------
3600
(所影响的行数为
1
行)
*/
--
删除测试
:
drop
function
roy_f,
roy_f2
drop
proc
roy_p
drop
table
ta
分享到:
相关推荐
非递归实现的基本思想是将递归调用转化为循环,并使用数据结构(如堆栈)存储中间结果,避免了递归带来的调用栈溢出问题。 非递归实现的步骤大致如下: 1. 初始化一个堆栈,用于保存待处理的阿克曼函数参数对`(m, ...
在本文中,我们将介绍两种实现 N级联动效果的方式:使用递归函数和使用数组。 第一种方式:使用递归函数 在第一种方式中,我们可以使用递归函数来实现 N级联动效果。递归函数是一种特殊的函数,它可以调用自身以便...
同时,这也为理解递归函数的优化提供了很好的实例,这对于任何计算机科学的学习者来说都是非常宝贵的经验。在实际编程中,理解和掌握如何有效地处理递归问题,尤其是在资源有限的情况下,是至关重要的技能。
为了解决这些问题,我们可以使用非递归函数,借助栈来实现。 非递归版本的阶乘函数可以使用循环和栈来实现。栈在这里的作用是存储待处理的数值。首先将初始值n压入栈中,然后进入循环,每次从栈顶取出一个元素,...
在这个非递归实现中,我们使用堆栈来存储待计算的 Ackerman 函数参数对 (m, n)。首先,将初始参数对压入堆栈,然后进入一个循环,直到堆栈为空。在循环中,我们取出堆栈顶部的参数对,根据 Ackerman 函数的定义进行...
本篇将深入探讨递归函数的概念,递归排序法,以及如何在C语言中实现它们。 首先,我们要理解什么是递归函数。递归函数是指函数在执行过程中调用自身,每次调用都会产生一个新的子问题,直到子问题足够简单,可以...
Ackerman函数,也被称为阿克曼函数,是一个非常特殊的数学函数,主要在计算理论和递归函数理论中被研究。这个函数是由美国数学家Maurice Karnaugh在1937年提出的,但以他的老师Gottfried Ackermann的名字命名。它是...
在编程领域,递归函数是一种基于函数自我调用来解决问题的策略。在Python中,递归函数的定义简单,逻辑清晰,使得复杂问题的解决变得直观。递归函数的关键在于每个递归调用都必须向基本情况靠近,即最终会达到一个不...
我们将使用递归函数来实现这个过程,并分析函数递归调用堆栈的过程。 首先,我们需要了解递归函数的工作原理。递归函数是一种特殊的函数,它可以调用自身,以便解决问题。在函数递归调用过程中,每次调用函数时,...
在编程领域,递归函数是一种强大的工具,它通过自身调用来解决复杂问题。递归的基本原理是将大问题分解为相同或相似的小问题,并通过解决这些小问题来达到解决整个问题的目的。本主题关注的是如何计算递归函数的调用...
在C语言中,实现递归函数需要注意以下几点: 1. **堆栈管理**:每次函数调用都会在内存堆栈中分配空间保存局部变量和返回地址。递归函数调用会持续占用这些资源,因此深度过大的递归可能导致堆栈溢出,这是使用递归...
在这个过程中,我们使用了指针来访问数组中的元素,并使用函数递归来实现数字的移动。函数`move`是一个递归函数,它将数组中的元素移动到指定的位置。该函数使用指针来访问数组中的元素,并使用递归调用自己来实现...
在这个场景中,"java_DWR递归函数实现城市的省市县三级联动" 提供了一个利用DWR处理多级联动选择的实例,特别适用于中国的行政区域划分,包括省、市、县三级。这种功能常见于地址选择、物流配送等业务场景。 首先,...
在编程领域,递归是一种强大的工具,用于解决复杂问题,特别是处理树形结构或具有重复子...通过适当优化,如使用记忆化,可以提高递归函数的效率。在实际应用中,理解和掌握递归方法对于解决问题和设计算法至关重要。
例如,如果我们有一个员工树结构,每个员工可能有下属,我们可以通过递归函数来获取整个组织结构。 ```sql CREATE FUNCTION get_subordinates(emp_id INT) RETURNS TEXT BEGIN DECLARE result TEXT; -- 递归逻辑 ...
递归调用是软件开发中一个重要的概念,它是函数实现的一个很重要的环节,许多程序中都或多或少的使用了递归函数。递归的意思就是函数自己调用自己本身,或者在自己函数调用的下级函数中调用自己。递归之所以能实现,...
4. **递归函数实现**: ```c void printn(char str[N], int m) { if (m == 1) printf("%c", str[0]); else { printf("%c", str[m - 1]); printn(str, m - 1); } } ``` `printn`函数是递归的核心,它接收...
这个过程可以用while循环实现,无需递归。 **查找函数** 查找函数用于在数据结构中寻找特定元素。非递归实现通常依赖于迭代,效率较高。 1. **线性查找**: 对于数组或链表,从头到尾逐个检查元素,直到找到目标或...
解析阶段,我们需要设计一个递归函数来处理表达式的不同部分。这可能涉及到以下步骤: 1. **读取输入**:从用户处获取数学表达式。 2. **预处理**:去除空格,处理括号,确保表达式的格式正确。 3. **分词**:将...