电子产业一站式赋能平台

PCB联盟网

搜索
查看: 76|回复: 0
收起左侧

嵌入式C语言,函数递归调用的应用场景!

[复制链接]

567

主题

567

帖子

4207

积分

四级会员

Rank: 4

积分
4207
发表于 2025-4-5 12:00:00 | 显示全部楼层 |阅读模式
我是老温,一名热爱学习的嵌入式工程师  R. f& D/ z1 W5 N1 s) K
关注我,一起变得更加优秀!递归是一种C语言函数调用的方式,就是在一个函数体内部不断调用其自身,直到条件满足后退出调用,以下是一些递归调用的例子,供各位老铁参考。2 X( P1 T2 ]5 ?/ Q# Z

, R0 ?! C4 c# ~( K+ O  M; ~1-汉诺塔:请输入盘子数,输出盘子移动的操作步骤。
1 q, ?: o. y: ~  e#include + @' N: m' i3 ?" t' ~7 C5 V/ f
void move(char from, char to) {
/ O# S0 p& e8 F% ?8 W   printf("%c to %c: W  \$ G( J6 M3 S& l8 E3 x9 I
", from, to);
2 p5 y: R1 x$ b) T3 z}
9 v2 R" s  D# _* I. j- h2 b1 Lvoid hanoi(int n, char a, char b, char c) {
1 R4 `. ~7 W% _7 E' D( K2 t   if (n == 1)$ d/ B: g, D& D( I/ Z- o3 ^
       move(a, c);1 i1 }/ M& `1 L$ Y% Q2 Y, v7 o
   else {
- c! J0 M9 Z# a% X       hanoi(n - 1, a, c, b);: Z1 e- L, @# o/ T% N( `% r
       move(a, c);
" s1 p) ?3 d1 c+ T       hanoi(n - 1, b, a, c);) u' U0 z4 N* h$ W3 U
  }0 O7 F  F  j8 k8 N6 y: O
}' `: p" R! C# i5 s
void main() {$ b8 R& ]3 a" c
   int n;; d0 R5 c. a# n, c# E
   scanf("%d", &n);
, I: C* B( e; q6 K3 z$ y$ J   hanoi(n, 'A', 'B', 'C');
1 E2 Q" t- F* T/ S: x' I( _9 u}: m& O5 |& z# ^- d: @" h. w
2-爬楼梯:树老师爬楼梯,他可以每次走1级或者2级,输入楼梯的级数,求不同的走法数。. V. \# l, g$ I6 K! [. n7 O4 V
#include
! ~2 ]% [/ h! Xint stair(int n) {5 Y6 t- B* d$ {2 L7 K
   if (n == 1) return 1;
' p- L3 R6 m' }- V. {8 R   if (n == 2) return 2;
+ C; L% u  o3 ^' [, t1 H   return stair(n - 1) + stair(n - 2);% [' R* z' Q$ p2 _8 s- b- O3 W
}+ l# f; O% g) D& f
void main() {
  y9 G, c+ s5 v. F/ U$ ~7 o: C   int n;' g' `& Z$ B3 L$ |
   scanf("%d", &n);- i6 j6 g4 d' }5 c: ]/ r3 g
   printf("%d", stair(n));
3 |% a6 u7 e3 U}, A' B4 o  b7 f* |1 _; U/ |

/ o# ^1 w7 E5 Y; {1 p) v) G8 Y% `3-爬楼梯:树老师爬楼梯,他可以每次走1级、2级或者3级,输入楼梯的级数,求不同的走法数。
0 w# S' F* `/ D5 R#include . s) B. k. r+ P5 Q3 r0 t2 h. ^( `/ U
int stair(int n) {
/ v; ?7 |+ l# X* j) ~- k5 }( D   if (n == 1) return 1;. A" u+ K) x0 I# @+ a% Q* ]8 W
   if (n == 2) return 2;
1 `) R+ L2 ^5 n4 R   if (n == 3) return 4;5 N* l0 l5 K9 @7 o0 p
   return stair(n - 1) + stair(n - 2) + stair(n - 3);
+ o, y/ A# A0 f* V7 E}
5 O+ b/ o2 S' o7 W# J5 p3 Svoid main() {
1 ]; P3 v9 D9 Q+ s+ H   int n;; P" k+ d$ _# ]; j) P
   scanf("%d", &n);+ ]  \4 B+ i; {( J3 t# }/ o
   printf("%d", stair(n));
; E# [( T# g9 z. n- k}
6 e  p: P8 Q& I6 O) m' X
* p) b- C; i+ E1 I. R
4-斐波那契数列:请输入项数,输出具体数列。
, R  ]+ z6 k. E7 X#include
6 G, ?3 e' x  t/ t# n3 {7 g0 Wint fibonacci(int n) {
( \; W) `4 T9 M" B   if (n == 1 || n == 2)% L6 l0 y' d- [9 P
       return 1;
; ]; h, A" V8 Q+ F% E( o& J) W; `   return fibonacci(n - 1) + fibonacci(n - 2);
8 X) \* G  {( Y% {: e}) y2 D/ r' N; y1 F0 h/ u; _& {
void main() {
7 o; v; i8 }1 b; i+ x. O( w   int n, i;
$ S" H+ x  w  s& M1 {( Z. R   scanf("%d", &n);2 m# C- c! K! |9 p+ W2 Q
   for (i = 1; i  n; i++)0 ?! E. ^- f" d5 _0 M& }
       printf("%d,", fibonacci(i));
. Q# q* `. m# n7 C; l* i2 s3 y}% u8 c8 |+ Z; p( ^+ t

4 e( H+ k# w& D5-求阶乘:请输入整数n,求1!+2!+3!+4!+5!+6!+7!+…+n!的和。
- s8 h4 q1 b/ o* R# Y4 R#include : O, c8 w. ^1 X! l% ^, @- A
int factorial(int n) {, [) L) [' ?- @
   if (n == 1) return 1;
! n* }! ~5 B% H5 Y3 W5 Z5 w( x   return n * factorial(n - 1);( q* J3 n% y& Q% m0 w
}" n2 Q  ]3 g2 |0 u
void main() {
& I, W  A4 p5 D" ]  G8 G& u   int n, i, sum = 0;/ S& [  g3 R1 {$ k
   scanf("%d", &n);
! k* {. E( `( o' k0 H   for (i = 1; i  n; i++)9 v& ]  ^: {1 I0 s4 \* i- X
       sum += factorial(i);9 Y  i% }: z; y3 O( U9 T
   printf("sum=%d", sum);
/ q: H) E  k7 |$ x% ?: f}
* f2 ~& r; x( v; z

; v! d/ j: g& ]6-取球问题:在n个球中,任意取m个(不放回),求有多少种不同取法。
& |. v9 L+ w$ H3 Z* c* }9 }#include 3 q( C- ?; L3 u  [
int ball(int n, int m) {
* r: k0 z- P% S* A   if (n  m)  return 0;
: b9 X3 Q, W6 E! l3 J( |   if (n == m) return 1;
0 e, w0 i3 z# ?   if (m == 0) return 1;7 v& }1 g) q# _8 A9 c
   return ball(n - 1, m - 1) + ball(n - 1, m);! ^, H3 _- M% S$ M; _. @9 t7 I
}
$ E; U- F/ l% z8 }) G0 Ivoid main() {) U0 e8 b+ H+ j: j" S: k
   int n, m;/ M4 o& e+ K' ~2 p
   scanf("%d%d", &n, &m);
! b2 a2 y: E7 g7 z& t- k/ N   printf("%d", ball(n, m));" c0 z- N2 P, w& C- R
}6 h) |" e/ L$ H: r' Y4 D& {
9 [8 l% g: b. o$ J
7-杨辉三角:输入要打印的层数,打印杨辉三角。
8 p/ M: N( v# j9 e#include " I3 ^2 Z, y9 s( z' P- D3 B
int triangle(int m, int n) {
  O  n4 }+ n/ @. J! d0 _   if (m == 0 || n == 0 || m == n)9 A) L: \0 l/ Q1 w) J7 P( e
       return 1;
) |* v2 d9 H2 p6 s4 Q   return triangle(m - 1, n) + triangle(m - 1, n - 1);1 o) }# H* \. [1 _* _
}
8 c: b  o9 f, I! U# [  I; cvoid main() {. c4 Y4 [, h/ w
   int n, i, j;7 y' p$ m! ?& g& X8 H  [
   scanf("%d", &n);" Q* g4 x! z; G) P: G& ?: D, O2 v
   for (i = 0; i  n; i++) {, r. y1 I! t1 d  h' b1 `
       for (j = 0; j  i; j++) {) A" H( Q! U# n# n
           printf("%d ", triangle(i, j));8 J1 Y, U7 d; H$ Y( ?# N7 K
      }7 p7 s4 W3 g% k& k0 B3 o
       printf("
& b( U' z2 y* f% a");
' Y( Q9 }, i1 N- L1 ]: q( g+ O  }1 m( `4 o6 `4 |( T- M4 u. G) M
}- ^4 `; r8 N, m$ s
( e, r# ^& P% {
8-求年龄:有5个人坐在一起,问第5个人多少岁,他说比第4个人大2岁。问第4个人多少岁,他说比第3个人大2岁。问第3个人多少岁,他说比第2个人大2岁。问第2个人多少岁,他说比第1个人大2岁。最后问第1个人,他说是10岁。请问第5个人多大?( G2 ]/ V: N  ^4 O
#include
5 \; f3 _; I9 a' t; u, r! A5 Nint age(int n) {# l3 v- G1 y* M5 Q; P
   if (n == 1) return 10;& |; D/ o0 q' I$ \, u$ _6 g
   return age(n - 1) + 2;
! {/ r4 L9 \  t# j, H}
- C6 B/ Q% X0 a0 o. X7 Vvoid main() {/ R7 J+ m% l. F
   printf("%d", age(5));
8 _. I7 h/ h1 M; k* w}& u4 _3 e) p  s" t$ b! B: ]
+ w3 d, \/ C# p# t) Z  U* @
9-猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半多一个。到第十天早上想再吃时,见只剩下一个桃子了。问最初有多少个桃子。
  }% E, ^+ }2 W0 s1 q. \& E+ _递归:* X) ^8 O2 c3 B1 u# |% |+ c% Z" c
#include ' _! N1 ?# ^$ J; Y
int peach(int n) {
: j' q6 [. m5 g1 `   if (n == 10) return 1;
$ h( u& {: Q) G* U$ w+ j' Z. O   return (peach(n + 1) + 1) * 2;) E" f" o7 ^4 o4 z% Z$ i
}; s8 A5 ]' }: ?' ?. `; @9 Z, @4 K, [
void main() {9 Q/ E2 V* ]9 d/ ]* a9 |
   printf("%d", peach(1));$ J; h$ f$ l1 w' B( R& `8 X* I
}循环:
+ m0 f2 {3 s$ `% W#include 6 V$ N5 H( c% w2 J, Z* y- J+ i
void main() {8 i' D# b# v- B% m2 D
   int i, s = 1;* i: \( s0 u2 M, c; p# ]
   for (i = 9; i >= 1; i--) {' v+ G/ w' H/ U' c$ p, ?5 m: Q
       s = (s + 1) * 2;- A% s7 k$ s" {% @
  }
: n! O) x; R' H  Z+ i. t" G/ _1 O   printf("%d", s);. |" r) Z$ B, @
}& V& G6 [: F. p! P! T7 U/ r& t0 N

8 Z, H5 B; x; W7 j10-猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半多一个。第十天同样是吃了前一天的一半加一个,最后剩下一个桃子。问最初有多少个桃子。7 K2 l0 ?5 G" _" f$ H) ^
递归:( u% M3 P3 w3 w3 C* h
#include 2 v* o+ c# Q1 L
int peach(int n) {3 C0 z+ h  Y3 u
   if (n == 11) return 1;
5 ]7 V+ \" D+ d* \2 Z) j3 [  ^/ J# ~5 x4 c   return (peach(n + 1) + 1) * 2;
$ I6 l' c) ^( k* K% @}# o* a: o. W: {2 d, a1 U
void main() {2 C7 K8 H9 M( v! T' P$ w5 x
   printf("%d", peach(1));
( e& w, V3 j: K1 z7 ~! F}循环:
4 e, [2 Z7 ]* X#include
8 J6 m! N( a& P9 ?# j3 i) R: mvoid main() {
1 w. `% K- A4 j7 D! w# a/ F- B   int i, s = 1;
( a5 G! Y! v. C6 f& t# V2 L   for (i = 10; i >= 1; i--) {
# o5 n) H  [  P4 S3 |9 d7 m* a0 \) U       s = (s + 1) * 2;$ \! A9 z$ p/ Q$ v! z6 A+ E9 f6 f
  }
; l- j, z, `( L/ _* ?7 z+ t( r' c   printf("%d", s);; f6 y  G; D; C6 W3 G# y( t# j
}% m6 {& N3 ~1 j1 h1 E& [

2 |7 ~& R, E& |' n* ~& |11-最大公约数:利用递归算法求两个数的最大公约数。
, `' R8 n6 f3 v* ?#include / Y' J5 F7 a! O
/* 最大公约数 */1 t2 m) o& ~0 e- V- H% w
int gcd(int a, int b) {5 b, q# U: w4 \8 j: _
   int t;
1 N  E8 F- B, @' e5 }$ x   if (a  b) {2 N8 {& u/ g0 y
       t = a;
9 l9 a7 {' _3 T4 B. c: H8 N6 W       a = b;* X) E" t/ {: ?; |: W& u) P. T
       b = t;: Y% Q  i" w' _7 N2 H, R
  }! R& t% a1 x$ |' g3 J
   if (b == 0) {
! ]0 J7 Q! B( {  c5 w       return a;
0 K; p2 s; g* Y) k# u. M1 [  }
6 H" E3 z+ W# {$ V   return gcd(b, a % b);0 k. k/ f, G8 Y2 }
}
) |' {) ~0 K; e# Rvoid main() {
' R- d% ]( r9 A   int a, b;. `0 f9 a% P) A' g) F; ^+ a
   scanf("%d%d", &a, &b);" p+ a# O# L9 \2 N7 B' }% X
   printf("gcd=%d", gcd(a, b));3 `1 V' U" E8 F( T: x# Z# T; Y
}
9 {: z* f/ X: Z' a7 P0 F1 f5 B
5 W) A6 P, ?7 q4 i% T6 ~4 L+ L6 e
12-逆序输出:输入一个正整数,将该正整数逆序输出。4 O- x, C7 p7 \& u
#include
3 ~) J2 d, l, D! cvoid printDigit(int n) {. b. `$ H  W7 v& v
   printf("%d", n % 10);7 e$ U% G# n% C6 e$ c
   if (n > 10) {. W' f% B& Q# h3 c( m3 `
       printDigit(n / 10);
% R7 J" h3 a& w  }! F7 ^5 j% s7 W, q
}( R! A& f# ?* s$ l$ _& X0 Q: i
void main() {) D8 K3 p1 Z0 b0 O' }8 X, t
   int n;  X8 _# H$ [1 ~
   scanf("%d", &n);/ a2 [8 a0 F% W
   printDigit(n);6 e7 f% d; c/ k
}6 D! q' O. C! T/ o: f* n$ i
, b) t' m! I. o& ]
13-逆序输出:输入一个字符串,将该字符串逆序输出。$ z) `& V7 p# q
#include + }. K' B2 a) W! C! a5 J6 P
void printStr(char *str) {
9 p- `) Q7 _& o, O8 f6 `3 y   if (*str != '\0')) t) b/ s# a" H" i
       printStr(str + 1);/ p6 V6 J3 j6 d$ l: m
   if (*str != '\0')
: s+ h6 l, j8 e) v, _4 V3 D! x       printf("%c", *str);
4 \4 ~; z9 a* d" E. Q' P* ]) p}7 r& Y" A: F3 |$ U
void main() {( A" G, o% `0 F3 I% y0 n
   char str[100];
: K( [. b: S9 C   gets(str);
& `8 Z& T: A, [/ b   printStr(str);! g) `9 |8 h% N& [& Z( g
}文章来源于网络,版权归原作者所有,如有侵权,请联系删除。/ {6 ^, y1 X: w' ^
' b7 N; Z+ p; ^: T: {8 T' p' s$ n6 S

qrm2jrqaqmg64020105210.jpg

qrm2jrqaqmg64020105210.jpg
6 C* l, m5 E- c5 R* j4 P

- E' n. A) I5 Z2 n4 k# m$ c4 H! I1 \$ Y-END-
9 j" h: ?% V! b! X; m+ @往期推荐:点击图片即可跳转阅读
2 G* E) ~6 Q1 C5 m9 m7 G

4n5g0yvao5p64020105310.jpg

4n5g0yvao5p64020105310.jpg
0 u. W, Y% a# ]7 }/ k) b" m
嵌入式软件,单总线通信的分层结构设计, x* l  p: J; o

( z9 c! }3 X/ z- h- c' \

wihc3o1sxbg64020105410.jpg

wihc3o1sxbg64020105410.jpg

/ w- \6 ~7 H" h6 Y% j, K4 x# y嵌入式软件设计,命令与函数映射表的具体应用示例!
. [1 z. q/ g+ S3 Z6 @6 [0 x8 m7 a4 _# ]. w0 q0 v9 ?3 d2 w

jp4dtpkfrci64020105510.jpg

jp4dtpkfrci64020105510.jpg
" Z3 D4 |0 p/ r( s; D
嵌入式牛马工程师,选对工具至少可以让自己干活轻松一点!/ S( g. E$ f  O3 _- N7 ~* O

) j+ W, Z) J0 }我是老温,一名热爱学习的嵌入式工程师
; N7 s& m$ d& O; ^7 a' O关注我,一起变得更加优秀!
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


联系客服 关注微信 下载APP 返回顶部 返回列表