全球旧事资料 分类
前。而且,因为这个原先的调用函数、现在的被调用函数在栈中较低的位置有它独立的一组参数和自变量,原先的参数和变量将不受影响,所以递归能正常工作。程序遍历执行这些函数的过程就被称为递归下降。程序员需保证递归函数不会随意改变静态变量和全局变量的值,以避免在递归下降过程中的上层函数出错。程序员还必须确保有一个终止条件来结束递归下降过程,并且返回到顶层。例如这样的程序就是递归:voidai
tmai
i
t
um5a
um
fvoidai
t
umif
um0retur
pri
tfd
uma
um在函数a里面又调用了自己,也就是自己调用本身,这样就是递归。那么有些人可能要想,这不是死循环吗?所以在递归函数中,一定要有retur
语句,没有retur
语句的递归函数是死循环。我们分析上面的例子,先调用a5,然后输出5,再在函数中调用本身a4,接着回到函数起点,输出4,……,一直到调用a0,这时发现已经满足if条件,不在调用而是返回了,所以这个递归一共进行了5次。如果没有这个retur
,肯定是死循环的。虽然递归不难理解,但是很多在在使用递归函数的时候,问题多多。这里面一般有两个原因:一是如何往下递归,也就是不知道怎么取一个变量递归下去;二是不知道怎么终止递归,经常弄个死循环出来。下面看几个例子:1求12……100的和先分析一下。第一递归变量的问题,从题目上看应该取12……100这些变量的值作为递归的条件;第二就是如何终止的问题,从题目上看应该是当数为100的时候就不能往下加了。那么我们试着写一下程序。i
taddi
tmai
i
t
um1s
s
add
umpri
tfd
s
getchi
taddi
t
umstatici
ts
s
umif
um100retur
s
add
um分析一下程序:前调用add1,然后在子函数中把这个1加到s
上面。接着调用add2,再把s
加2上来。这样一直到100,到了100的时候,先加上来,然后发现满足了if
f条件,这时返回s
的值,也就是12……100的值了。这里有一个问题一定要注意,就是statici
ts
有些人就不明白,为什么要使用static类型修饰符,为什么不使用i
ts
0?如果使用i
ts
0这样的语句,在每次调用函数add的时候,s
的值都是赋值为0也就是第一步虽然加了1上来,可是第二次调用的时候,s
又回到了0。我们前面说了,static能保证本次初始化的值是上次执行后的值,这样也就保证了前面想加的结果不会丢失。如果你修改为i
ts
0,最后结果一定是最后的100这个值而不是5050。2求数列s
s
1s
2的第
项。其中s1s21。可以看r
好听全球资料 返回顶部