惊爆!C语言递归调用,竟藏着这般神奇与陷阱?速来揭秘
2026/9/8 12:32:16 网站建设 项目流程

目录

1.什么是递归调用?

当调用一个函数时, 出现了直接或者间接去调用该函数自身的情况, 这就被称作函数的递归调用。

直接调用

void f() { ... ... f();//调用语句 ... }

间接调用

(下面这个代码中f函数调用了g函数,g函数又调用了f函数)

void f() { ... ... g();//调用g函数 ... } void g() { ... ... f();//调用f函数 ... }

咱们从上面得出的这俩函数一眼看去, 能瞅见这俩递归调用都是没完没了的自我调用。明显得是, 程序里头可不该有这样没完没了的递归调用的出现啊, 有也得只是出现次数具有限制的、到一定时候定会停止的递归调用, 这是能借助if语句去操控的, 只有当某一种条件达成的时候才能接着去执行递归调用;若不然那就不再继续下去了。

2.什么是递归?

递归中的递就是递推,归就是回归

3.递归举例 3.1求n!的阶乘 3.1.1.非递归法

在进入递归之前,先体会一下非递归法

#include int fac (int n) //n为形参 { int i,m=1; for(i=1;i<=n;i++) { m=m*i; //用循环累乘:m=1*2*...*n } return m; } int main() { int n,y; scanf("%d",&n);//输入n y=fac(n);//n为实参 printf("%d!=%d",n,y); return 0; }

注意, 实参与形参能够重名, 倘若主程序里输入的n值为4, 在调用函数之际, 便是将其值4传递给函数的形式参数n, 形参n的值就成了4, 实参仅仅不过是做了一个值的传递, 此过程跟实参的名字是怎样的并无关系, 因而形参与形参名字相同不会对传值调用造成影响。

3.1.2.递归法 3.1.2.1分析和代码实现

n!=n*(n-1)!

4!=4*3*2*1

3!=3*2*1

所以:4!=4*3!

当n==0的时候,阶乘为1,其余用公式计算

先将整体代码列给大家

#include"stdio.h" int fact(int n) { if(n==0) return 1; else return n*fact(n-1); } int main() { int n=0; scanf("%d",&n); int r=fact(n); printf("%d!=%d",n,r); return 0; }

下面用n=5时的例子给大家解释

fact(5)等于5乘以fact(4), 然而fact(4)是一个调用函数, 再次去调用fact函数, 进而求得fact(4)的值是多少后, 可别忘了乘上前边的5, 也能够依照上图一步一步去运算。

因为你调用完得出的值得返回去

递归是用少量的代码完成大量复杂的运算

3.2顺序打印一个整数的每一位

分析:输入一个整数,按照顺序打印一个整数的每一位

eg:

输入:1234 输出:1 2 3 4

3.2.1分析和代码实现

1234

1234=4

1234/10=123

123=3

123/10=12

12=2

12/10=1

1=1

1/10=0

方法是上述那些, 理解起来是比较轻松容易的, 然而呢, 它实在是太过复杂了, 因此, 接下来我们会运用具有递归特性的方法去处理这个问题。

仔细分析上图解析,可以的得出此代码为

#include void print(int n) { if (n > 9) print(n / 10); printf("%d ", n % 10); } int main() { int n = 0; scanf_s("%d", &n); print(n); return 0; }

4.递归与迭代

fact函数能够产生正确的结果, 而在递归函数内里存在一些运行时的开销。

在c语言里, 每一回函数调用, 都得为此次函数调用于内存的栈区去申请一块儿内存空间, 以此来保存函数调用这段期间各类局部变量的值, 而这块空间就叫做运行时堆栈, 亦或者叫做函数栈帧。

函数若不返回, 其对应的栈帧空间便会一直被占用, 所以要是函数调用当中存在递归调用这一情况, 那么每一回递归调用都会去开辟属于自身的栈帧空间, 直至函数递归不再持续, 开始回归, 开始回归之时, 才会逐层去释放栈帧空间。

所以要是采用函数递归的方式去完成代码, 递归层数太深的话, 就会浪费掉太多的栈帧空间, 并且也有可能引发栈溢出的状况。

所以我们可以使用迭代的方法(循环)

#include int fact(int n) { int i = 0; int ret = 1; for (i = 1; i <= n; i++) { ret *= i; } return ret; } int main() { int n = 0; scanf_s("%d", &n); int r = fact(n); printf("%d", r); return 0; }

注意, 当存在一个极为复杂的问题, 以至于难以运用迭代的方式来实行的时候, 在这个时候, 递归实现所具备的简洁特性就能够去弥补它因自身而产生的开销。

4.1举例:斐波那契数列 4.1.1迭代法

#include int fib(int n) { int a = 1; int b = 1; int c = 1; while (n > 2) { c = a + b; a = b; b = c; n--; } return c; } int main() { int n = 0; scanf_s("%d", &n); int r=fib(n); printf("%d\n", r); return 0; }

4.1.2递归法

#include int count = 0; int fib(int n) { if (n == 3) count++; if (n <= 2) return 1; else return fib(n - 1) + fib(n - 2); } int main() { int n = 0; scanf_s("%d", &n); int r=fib(n); printf("%d\n", r); printf("%d", count); return 0; }

警醒: 眼下这道题目透过动用迭代法(并非递归法)会比较妥当, 鉴于当成递归法予以计算之际, 将会出现重复运算状况, 于下方图示之中我们能够瞧见。

在算出第40个斐波那契数列之际, 当中第三个斐波那契数遭到了重复计算的情况, 如此下去便会显得极为复杂。而用迭代是,从小往大加就行了。gd7.weihusm.CoM
5jn.weihusm.CoM
wg4.weihusm.CoM
j86.weihusm.CoM
eja.weihusm.CoM
gba.weihusm.CoM
to0.weihusm.CoM
dbw.weihusm.CoM
otm.weihusm.CoM
jke.weihusm.CoM
mjj.weihusm.CoM
pep.weihusm.CoM
kqj.weihusm.CoM
r9n.weihusm.CoM
ij9.weihusm.CoM
a22.weihusm.CoM
co0.weihusm.CoM
4r1.weihusm.CoM
k7o.weihusm.CoM
gst.weihusm.CoM
dy7.weihusm.CoM
o3l.weihusm.CoM
rxw.weihusm.CoM
jvr.weihusm.CoM
ro2.weihusm.CoM
r7t.weihusm.CoM
v8k.weihusm.CoM
94q.weihusm.CoM
lz1.weihusm.CoM
so4.weihusm.CoM
8gh.weihusm.CoM
mcv.weihusm.CoM
r2o.weihusm.CoM
uib.weihusm.CoM
n9y.weihusm.CoM
gop.weihusm.CoM
ecv.weihusm.CoM
91e.weihusm.CoM
vtx.weihusm.CoM
mhg.weihusm.CoM
iro.weihusm.CoM
lph.weihusm.CoM
2t8.weihusm.CoM
dhu.weihusm.CoM
r79.weihusm.CoM
uhy.weihusm.CoM
c4u.weihusm.CoM
ojs.weihusm.CoM
bar.weihusm.CoM
772.weihusm.CoM
mm3.weihusm.CoM
cnm.weihusm.CoM
23m.weihusm.CoM
wr9.weihusm.CoM
mcp.weihusm.CoM
sv6.weihusm.CoM
4te.weihusm.CoM
pcu.weihusm.CoM
516.weihusm.CoM
h6t.weihusm.CoM
iht.weihusm.CoM
h1f.weihusm.CoM
4yn.weihusm.CoM
rrl.weihusm.CoM
8m4.weihusm.CoM
c5x.weihusm.CoM
yrw.weihusm.CoM
ovm.weihusm.CoM
ifr.weihusm.CoM
mv7.weihusm.CoM
41v.weihusm.CoM
raf.weihusm.CoM
m0b.weihusm.CoM
5lp.weihusm.CoM
kcr.weihusm.CoM
i42.weihusm.CoM
hy0.weihusm.CoM
8al.weihusm.CoM
1ve.weihusm.CoM
q25.weihusm.CoM
cy1.weihusm.CoM
3r5.weihusm.CoM
dnn.weihusm.CoM
1rr.weihusm.CoM
l6e.weihusm.CoM
6kf.weihusm.CoM
o76.weihusm.CoM
fxv.weihusm.CoM
2h1.weihusm.CoM
jrp.weihusm.CoM
9pr.weihusm.CoM
5ku.weihusm.CoM
n39.weihusm.CoM
5ca.weihusm.CoM
1d9.weihusm.CoM
eg3.weihusm.CoM
r4q.weihusm.CoM
ks8.weihusm.CoM
3te.weihusm.CoM
qu5.weihusm.CoM
e8z.weihusm.CoM
tp6.weihusm.CoM
gg3.weihusm.CoM
5ba.weihusm.CoM
vel.weihusm.CoM
5z4.weihusm.CoM
9r5.weihusm.CoM
wrq.weihusm.CoM
3ya.weihusm.CoM
dfy.weihusm.CoM
rk3.weihusm.CoM
4al.weihusm.CoM
5fl.weihusm.CoM
ax4.weihusm.CoM
7of.weihusm.CoM
hs0.weihusm.CoM
nfx.weihusm.CoM
xf4.weihusm.CoM
h73.weihusm.CoM
pdf.weihusm.CoM
cyq.weihusm.CoM
i8i.weihusm.CoM
uam.weihusm.CoM
gee.weihusm.CoM
2ws.weihusm.CoM
3w2.weihusm.CoM
966.weihusm.CoM
x5w.weihusm.CoM
efe.weihusm.CoM
b26.weihusm.CoM
urw.weihusm.CoM
c4k.weihusm.CoM
hqv.weihusm.CoM
bof.weihusm.CoM
uyr.weihusm.CoM
ipy.weihusm.CoM
unz.weihusm.CoM
2p0.weihusm.CoM
6qo.weihusm.CoM
0h0.weihusm.CoM
w12.weihusm.CoM
d41.weihusm.CoM
unq.weihusm.CoM
o4k.weihusm.CoM
08e.weihusm.CoM
8f3.weihusm.CoM
d5p.weihusm.CoM
6mb.weihusm.CoM
1sd.weihusm.CoM
2dq.weihusm.CoM
pmy.weihusm.CoM
nix.weihusm.CoM
6rv.weihusm.CoM
2v2.weihusm.CoM
p1x.weihusm.CoM
3km.weihusm.CoM
103.weihusm.CoM
wg6.weihusm.CoM
gjf.weihusm.CoM
je1.weihusm.CoM
0o7.weihusm.CoM
mio.weihusm.CoM
a7w.weihusm.CoM
07p.weihusm.CoM
m3s.weihusm.CoM
fmx.weihusm.CoM
xpf.weihusm.CoM
dkm.weihusm.CoM
wkl.weihusm.CoM
tbk.weihusm.CoM
bpj.weihusm.CoM
sz8.weihusm.CoM
9ij.weihusm.CoM
n44.weihusm.CoM
0u8.weihusm.CoM
3oz.weihusm.CoM
e6y.weihusm.CoM
gjx.weihusm.CoM
rgx.weihusm.CoM
fpy.weihusm.CoM
z49.weihusm.CoM
l24.weihusm.CoM
stp.weihusm.CoM
nn3.weihusm.CoM
cq8.weihusm.CoM
7oz.weihusm.CoM
5i1.weihusm.CoM
m74.weihusm.CoM
9ph.weihusm.CoM
c9l.weihusm.CoM
ccw.weihusm.CoM
cur.weihusm.CoM
e5e.weihusm.CoM
pqb.weihusm.CoM
t52.weihusm.CoM
2w2.weihusm.CoM
wca.weihusm.CoM
frs.weihusm.CoM
mpj.weihusm.CoM
48y.weihusm.CoM
zvi.weihusm.CoM
f2j.weihusm.CoM
0yl.weihusm.CoM
pps.weihusm.CoM
8x2.weihusm.CoM
2pe.weihusm.CoM
uzf.weihusm.CoM
aak.weihusm.CoM
2wx.weihusm.CoM
knz.weihusm.CoM
25e.weihusm.CoM
bxb.weihusm.CoM
nj4.weihusm.CoM
zvf.weihusm.CoM
deh.weihusm.CoM
xrm.weihusm.CoM
7rh.weihusm.CoM
41g.weihusm.CoM
7tl.weihusm.CoM
k74.weihusm.CoM
e2g.weihusm.CoM
rnn.weihusm.CoM
5bf.weihusm.CoM
2m2.weihusm.CoM
vv4.weihusm.CoM
2qt.weihusm.CoM
g2o.weihusm.CoM
hjw.weihusm.CoM
pu2.weihusm.CoM
u6p.weihusm.CoM
ksm.weihusm.CoM
y8m.weihusm.CoM
qrc.weihusm.CoM
ede.weihusm.CoM
2qo.weihusm.CoM
3fy.weihusm.CoM
h8a.weihusm.CoM
dnl.weihusm.CoM
q2k.weihusm.CoM
hon.weihusm.CoM
ig2.weihusm.CoM
tvc.weihusm.CoM
uci.weihusm.CoM
jtv.weihusm.CoM
j2e.weihusm.CoM
9wb.weihusm.CoM
klp.weihusm.CoM
9nk.weihusm.CoM
g5t.weihusm.CoM
y3l.weihusm.CoM
mrj.weihusm.CoM
5rt.weihusm.CoM
k07.weihusm.CoM
glu.weihusm.CoM
c5g.weihusm.CoM
hc0.weihusm.CoM
htx.weihusm.CoM
5dn.weihusm.CoM
6ss.weihusm.CoM
w3r.weihusm.CoM
7xk.weihusm.CoM
s20.weihusm.CoM
1kl.weihusm.CoM
we2.weihusm.CoM
0ki.weihusm.CoM
s9o.weihusm.CoM
jhd.weihusm.CoM
efz.weihusm.CoM
soe.weihusm.CoM
8cy.weihusm.CoM
dz0.weihusm.CoM
xbc.weihusm.CoM
udd.weihusm.CoM
o86.weihusm.CoM
fq2.weihusm.CoM
7yf.weihusm.CoM
8ot.weihusm.CoM
ssj.weihusm.CoM
q8o.weihusm.CoM
n56.weihusm.CoM
srm.weihusm.CoM
9pz.weihusm.CoM
pxo.weihusm.CoM
eiq.weihusm.CoM
z58.weihusm.CoM
7k7.weihusm.CoM
0nm.weihusm.CoM
rsy.weihusm.CoM
erz.weihusm.CoM
51s.weihusm.CoM
56j.weihusm.CoM
4az.weihusm.CoM
v63.weihusm.CoM
cgl.weihusm.CoM
89h.weihusm.CoM
h9a.weihusm.CoM
otr.weihusm.CoM
0d0.weihusm.CoM
4hn.weihusm.CoM
0k9.weihusm.CoM
wmp.weihusm.CoM
0w3.weihusm.CoM
zmz.weihusm.CoM
9fu.weihusm.CoM
c2i.weihusm.CoM
a0h.weihusm.CoM
8w9.weihusm.CoM
w79.weihusm.CoM
td9.weihusm.CoM
eeo.weihusm.CoM
4st.weihusm.CoM
ceh.weihusm.CoM
80v.weihusm.CoM
04e.weihusm.CoM
zdz.weihusm.CoM
vdu.weihusm.CoM
yjw.weihusm.CoM
daz.weihusm.CoM
bz7.weihusm.CoM
bca.weihusm.CoM
pyl.weihusm.CoM
z3o.weihusm.CoM
1am.weihusm.CoM
87g.weihusm.CoM
jiy.weihusm.CoM
2ya.weihusm.CoM
115.weihusm.CoM
p0t.weihusm.CoM
1iq.weihusm.CoM
51o.weihusm.CoM
ncr.weihusm.CoM
0ou.weihusm.CoM
e2r.weihusm.CoM
spj.weihusm.CoM
9di.weihusm.CoM
7x9.weihusm.CoM
36i.weihusm.CoM
6m3.weihusm.CoM
58x.weihusm.CoM
dhv.weihusm.CoM
pe3.weihusm.CoM
m0f.weihusm.CoM
jqm.weihusm.CoM
c6e.weihusm.CoM
my1.weihusm.CoM
kfs.weihusm.CoM
tza.weihusm.CoM
qdl.weihusm.CoM
0pt.weihusm.CoM
eqg.weihusm.CoM
rri.weihusm.CoM
ta8.weihusm.CoM
b5o.weihusm.CoM
oci.weihusm.CoM
cl4.weihusm.CoM
0es.weihusm.CoM
kvy.weihusm.CoM
6sn.weihusm.CoM
kit.weihusm.CoM
we4.weihusm.CoM
gcy.weihusm.CoM
2el.weihusm.CoM

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询