c语言递归调用例题,递归算法c语言
- 软件开发
- 2023-08-29
- 85
大家好,今天小编来为大家解答c语言递归调用例题这个问题,递归算法c语言很多人还不知道,现在让我们一起来看看吧!C语言用递归些汉诺塔游戏,有个步骤不明白,大一新生求助啊这...
大家好,今天小编来为大家解答c语言递归调用例题这个问题,递归算法c语言很多人还不知道,现在让我们一起来看看吧!
C语言用递归些汉诺塔游戏,有个步骤不明白,大一新生求助啊
这是一个递归的算法。
第一步,n-1个金片从a经c移动到b
不是“一步”完成的,而是“一个阶段”(一次递归调用)完成的。
在假定它完成的基础上,第二步就可以完成了。
在上面两步完成的基础上,第三步,n-1个金片从b经a移动到c,完成后全部工作就完成了。
========
至于“n-1个金片从a经c移动到b”是怎么完成的,这就要“老和尚给小和尚讲故事”了:
第一步,先移动n-2个金片,再移动第n-1个金片,最后把n-2个金片移动到位。
C语言规定,除主函数外,程序中各函数之间
你这个应该是选择题,答案是程序中各函数之间既允许直接递归调用也允许间接递归调用
c语言递归调用的形式和特点
例如斐波那契数列就是典型的递归调用,通过不断调用自身函数计算结果。
求递归算法的时间复杂度例题及答案
(1)递归执行过程
例子:求N!。
这是一个简单的"累乘"问题,用递归算法也能解决。
n!=n*(n-1)!n>1
0!=1,1!=1n=0,1
因此,递归算法如下:
Java代码
fact(intn){
if(n==0||n==1)
return1;
else
returnn*fact(n-1);
}
以n=3为例,看运行过程如下:
fact(3)-----fact(2)-----fact(1)------fact(2)-----fact(3)
------------------------------>------------------------------>
递归回溯
递归算法在运行中不断调用自身降低规模的过程,当规模降为1,即递归到fact(1)时,满足停止条件停止递归,开始回溯(返回调用算法)并计算,从fact(1)=1计算返回到fact(2);计算2*fact(1)=2返回到fact(3);计算3*fact(2)=6,结束递归。
算法的起始模块也是终止模块。
(2)递归实现机制
每一次递归调用,都用一个特殊的数据结构"栈"记录当前算法的执行状态,特别地设置地址栈,用来记录当前算法的执行位置,以备回溯时正常返回。递归模块的形式参数是普通变量,每次递归调用得到的值都是不同的,他们也是由"栈"来存储。
(3)递归调用的几种形式
一般递归调用有以下几种形式(其中a1、a2、b1、b2、k1、k2为常数)。
<1>直接简单递归调用:f(n){...a1*f((n-k1)/b1);...};
<2>直接复杂递归调用:f(n){...a1*f((n-k1)/b1);a2*f((n-k2)/b2);...};
<3>间接递归调用:f(n){...a1*f((n-k1)/b1);...},
g(n){...a2*f((n-k2)/b2);...}。
2.递归算法效率分析方法
递归算法的分析方法比较多,最常用的便是迭代法。
迭代法的基本步骤是先将递归算法简化为对应的递归方程,然后通过反复迭代,将递归方程的右端变换成一个级数,最后求级数的和,再估计和的渐进阶。
<1>例:n!
算法的递归方程为:T(n)=T(n-1)+O(1);
迭代展开:T(n)=T(n-1)+O(1)
=T(n-2)+O(1)+O(1)
=T(n-3)+O(1)+O(1)+O(1)
=......
=O(1)+...+O(1)+O(1)+O(1)
=n*O(1)
=O(n)
这个例子的时间复杂性是线性的。
<2>例:如下递归方程:
T(n)=2T(n/2)+2,且假设n=2的k次方。
T(n)=2T(n/2)+2
=2(2T(n/2*2)+2)+2
=4T(n/2*2)+4+2
=4(2T(n/2*2*2)+2)+4+2
=2*2*2T(n/2*2*2)+8+4+2
=...
=2的(k-1)次方*T(n/2的(i-1)次方)+$(i:1~(k-1))2的i次方
=2的(k-1)次方+(2的k次方)-2
=(3/2)*(2的k次方)-2
=(3/2)*n-2
=O(n)
这个例子的时间复杂性也是线性的。
<3>例:如下递归方程:
T(n)=2T(n/2)+O(n),且假设n=2的k次方。
T(n)=2T(n/2)+O(n)
=2T(n/4)+2O(n/2)+O(n)
=...
=O(n)+O(n)+...+O(n)+O(n)+O(n)
=k*O(n)
=O(k*n)
=O(nlog2n)//以2为底
一般地,当递归方程为T(n)=aT(n/c)+O(n),T(n)的解为:
O(n)(a<c&&c>1)
O(nlog2n)(a=c&&c>1)//以2为底
O(nlogca)(a>c&&c>1)//n的(logca)次方,以c为底
上面介绍的3种递归调用形式,比较常用的是第一种情况,第二种形式也有时出现,而第三种形式(间接递归调用)使用的较少,且算法分析
比较复杂。下面举个第二种形式的递归调用例子。
<4>递归方程为:T(n)=T(n/3)+T(2n/3)+n
为了更好的理解,先画出递归过程相应的递归树:
n-------->n
n/32n/3-------->n
n/92n/92n/94n/9-------->n
...............................
--------
总共O(nlogn)
累计递归树各层的非递归项的值,每一层和都等于n,从根到叶的最长路径是:
n-->(2/3)n-->(4/9)n-->(12/27)n-->...-->1
设最长路径为k,则应该有:
(2/3)的k次方*n=1
得到k=log(2/3)n//以(2/3)为底
于是T(n)<=(K+1)*n=n(log(2/3)n+1)
即T(n)=O(nlogn)
由此例子表明,对于第二种递归形式调用,借助于递归树,用迭代法进行算法分析是简单易行的。
c语言递归运算的使用
递归就是自己调用自己。递归本质上还是属于循环,合理使用递归可以简化程序,使代码易于理解,简洁。在编写递归时,要注意几点,一是注意递归必须要有出口,不要限入无限递归的错误;
二是在不影响代码简洁度和可读性的情况下,能使用循环的就不要使用递归,因为递归效率低下。希望以上回答可以帮助到您。
c语言递归详细讲解
C语言递归是:
简单来说,就是一个函数直接或间接调用自身的一种方法。通常递归可以将一个复杂的大型问题层层转化为一个与原问题相似的规模较小的问题来求解。它的核心思想是把大事化小。
递归就好比查英文字典,当查找第一个词时你发现这个词的解释中有一个单词你看不懂,于是你开始查找第二个单词,当查第二个单词的时候你发现这个单词的解释中依然有你看不懂的单词,于是你开始了第三次查找…直到有一个单词的解释你全部都能看懂,那么递归结束,然后开始后退,逐个明白之前查过的每一个单词,最后知道了第一个单词的意思。
好了,关于c语言递归调用例题和递归算法c语言的问题到这里结束啦,希望可以解决您的问题哈!
本文链接:http://xinin56.com/ruanjian/12108.html