电子产业一站式赋能平台

PCB联盟网

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

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

[复制链接]

551

主题

551

帖子

3631

积分

四级会员

Rank: 4

积分
3631
发表于 昨天 12:00 | 显示全部楼层 |阅读模式
我是老温,一名热爱学习的嵌入式工程师
; W5 B/ X7 `7 I关注我,一起变得更加优秀!递归是一种C语言函数调用的方式,就是在一个函数体内部不断调用其自身,直到条件满足后退出调用,以下是一些递归调用的例子,供各位老铁参考。
5 {- a& t2 [4 H: L
: G( N! X4 n% `+ f8 i1-汉诺塔:请输入盘子数,输出盘子移动的操作步骤。
9 S% H1 {5 _' R7 r$ j5 F#include 6 H% \3 p# u* ?% q5 s5 d6 n# q
void move(char from, char to) {
. x# `! I% }0 V5 Z& D   printf("%c to %c
2 t# J( \. j" t% D" C3 }", from, to);* E% z; |, Z" m
}  U+ Q! H9 C9 D" f6 E, p1 ?+ j0 F2 h/ ]
void hanoi(int n, char a, char b, char c) {4 q0 o; }3 P  e% o( S- |' e6 l
   if (n == 1)! I1 @" E: d/ V  W; X; N% R/ S
       move(a, c);
/ Y# H' u- B& y& O3 I8 W   else {( `6 N2 M& q& l. T" e( v
       hanoi(n - 1, a, c, b);
, A+ k+ c" v2 H2 [+ Q, \       move(a, c);
, |, ]' j0 g* l/ q       hanoi(n - 1, b, a, c);! x* m% X, \0 x' `" n7 d9 L
  }
5 [# b9 U2 q9 P8 j2 _3 I}4 b' V3 w7 M7 |! I# d* W( y
void main() {
9 M& ?# K1 v0 G1 g  L, U   int n;
/ Q6 \% x& w2 Z2 W% p! u/ E   scanf("%d", &n);% K9 Q# \+ x8 }1 m. Z& e6 t
   hanoi(n, 'A', 'B', 'C');# ?6 Y* K0 f  i! O# S6 l* D3 U
}
! ]. @' C) h7 j5 B6 h1 x9 `& T2-爬楼梯:树老师爬楼梯,他可以每次走1级或者2级,输入楼梯的级数,求不同的走法数。2 ^, }. b6 r  Z) I) X, F* ^
#include
- @) d4 E; Z- x$ G3 @2 @+ n+ vint stair(int n) {
) m8 E" O3 ]9 f. P7 r- _   if (n == 1) return 1;/ n$ M: m1 q8 }4 r
   if (n == 2) return 2;
4 p& R9 h2 t8 @/ a  L2 Q   return stair(n - 1) + stair(n - 2);! m* w5 c  t; z- q9 |. G3 U
}
' `( q5 U3 Z, K. d: W3 [void main() {
2 _; \$ b. {+ x" ^   int n;
% b5 U- H: _7 U; a4 U) b8 u   scanf("%d", &n);$ y& g" @: `' S+ S1 r
   printf("%d", stair(n));
, u) C: j1 A# |: H' ^}9 {, K4 ^* M7 V) ^; h: U' I
1 m* T$ U" W* s! X% \
3-爬楼梯:树老师爬楼梯,他可以每次走1级、2级或者3级,输入楼梯的级数,求不同的走法数。; l8 Y4 e/ t+ V  \, S8 y3 O
#include
$ ^) {/ C6 B' A3 J, a# vint stair(int n) {* e$ E: H2 V5 o$ K$ H
   if (n == 1) return 1;
- N0 F) R  `2 K- y- F! I   if (n == 2) return 2;
! k' r  h: \  `/ S) L& z   if (n == 3) return 4;. a5 |7 |: ^& Q& l
   return stair(n - 1) + stair(n - 2) + stair(n - 3);
: u- G. `( m! _1 @$ ~9 b( U}* ?5 t! f3 \+ m; u2 C  P" \
void main() {
& [0 B0 v" F+ v; A0 Z  Y# `/ J7 o   int n;; z) u4 A& Q; D, f/ r
   scanf("%d", &n);
+ Z% \) v4 P) j8 V7 V   printf("%d", stair(n));
- a1 ^# o  i8 m4 B' W}
% G$ r! N/ @# D2 W6 d

! H# M# F$ r6 D/ b% ^% ~* k4-斐波那契数列:请输入项数,输出具体数列。
  @7 f& |2 j( y. ]% T) W#include
" r5 j7 c* A/ W5 T1 F- \int fibonacci(int n) {
- n4 z$ _: F+ W( J" K* v+ e9 z: e   if (n == 1 || n == 2)
4 W( D6 p; X% s+ A( o2 Q# t+ u       return 1;
4 I5 C7 _3 F5 ^6 _& q* |. F7 R   return fibonacci(n - 1) + fibonacci(n - 2);; g. N: }) t; t3 m, K5 s
}9 r8 n& y5 s* G. S- V
void main() {) j: c5 U6 q- B
   int n, i;
. U$ C9 w( [5 ^* J' u8 U0 o   scanf("%d", &n);
/ g8 @$ K7 U4 Z3 h' X, N9 d" |8 x' Z   for (i = 1; i  n; i++)" g7 J! ?+ i$ y. @' {
       printf("%d,", fibonacci(i));* D1 l; o* ?! \
}% G, m  q, H3 O0 D9 @. A
, ^% S5 F, i, w/ s1 \0 a* o
5-求阶乘:请输入整数n,求1!+2!+3!+4!+5!+6!+7!+…+n!的和。
. p( j/ J0 I' I$ c! k) B* t- N6 @#include
6 B- z' @( m7 eint factorial(int n) {! v2 d" O2 j7 w1 \  U1 ?6 Q) H. s  K
   if (n == 1) return 1;1 ~; L8 V& ?! L: M0 B- S% t" h" p
   return n * factorial(n - 1);
/ \6 l3 |, ?7 Y% P/ b( ?. J}' J+ I! Y0 P7 e" S/ C
void main() {
, H+ B# ?/ d7 y" J% E   int n, i, sum = 0;
3 U  B1 {# Z; ^* d7 f5 O7 u   scanf("%d", &n);
. a& D# `0 O- ^5 r, F& O9 m   for (i = 1; i  n; i++)" }1 R- i# W" C7 T7 r
       sum += factorial(i);% p" c: ]/ h1 R% y" i& L
   printf("sum=%d", sum);: K4 h+ ]6 M5 ?
}
$ |5 f' `: F2 W9 S
: X8 n1 g5 Z* y$ w: ^) ?' |  V
6-取球问题:在n个球中,任意取m个(不放回),求有多少种不同取法。# ~* v; k5 D5 Y4 [. \) P  c
#include ) T1 C& j+ l: S3 z+ y/ h" H
int ball(int n, int m) {
: ]* G  f' }+ s   if (n  m)  return 0;% V3 u5 W# V2 n4 |. t3 I
   if (n == m) return 1;
8 S+ n# A. ~) }+ ~7 ?   if (m == 0) return 1;
, p  _0 G0 m  g2 Z- }   return ball(n - 1, m - 1) + ball(n - 1, m);& V- @9 ?; W+ m( m8 W" m
}
# M8 ]% D  g7 F9 Hvoid main() {' ^$ v3 P0 o& L: q0 u! W
   int n, m;
3 t4 r& A) m4 O, ]. ]   scanf("%d%d", &n, &m);
2 l1 r0 F6 B. w6 I- ?( A$ u   printf("%d", ball(n, m));# b) K, |/ b3 G# j
}9 i  d7 |2 k/ R, c. h% }/ X/ n( L
& U7 r: }6 X8 O. Y! }! K
7-杨辉三角:输入要打印的层数,打印杨辉三角。
) I  v  B9 P" E1 H#include 0 t5 e; s' j6 Y8 g1 C
int triangle(int m, int n) {: n: x- s+ }2 S9 c
   if (m == 0 || n == 0 || m == n)0 B  D5 w( A9 v* R" \2 _
       return 1;3 a, v. I) v/ L* _3 P' h& }
   return triangle(m - 1, n) + triangle(m - 1, n - 1);. e2 s* }& b& r% \, ]
}2 o* E# Z) Z1 j' m( O0 [' [+ }( S
void main() {
7 z* K2 K8 @( Z: |   int n, i, j;: a& s" g! h5 `8 t7 m
   scanf("%d", &n);
% d. P6 U* L+ x' B/ @& v   for (i = 0; i  n; i++) {5 O& k8 Y% K6 \. c0 R
       for (j = 0; j  i; j++) {
. d' V: y7 H8 }% Q           printf("%d ", triangle(i, j));
) z+ w$ F/ E: Z) [4 K4 A2 k9 S      }6 j( c' J# l) }. D2 F
       printf("
4 |# G" H3 }9 [) n");
# w$ `! Q3 i; L! F3 M1 E0 n$ C  }8 y* Y& D* [4 [) S5 D" O& P1 |
}, b0 y2 k' `' R* q5 c

( E0 _; \: u+ c' V2 r9 O) P0 Y8-求年龄:有5个人坐在一起,问第5个人多少岁,他说比第4个人大2岁。问第4个人多少岁,他说比第3个人大2岁。问第3个人多少岁,他说比第2个人大2岁。问第2个人多少岁,他说比第1个人大2岁。最后问第1个人,他说是10岁。请问第5个人多大?8 P1 \2 x) m" F9 s! V5 e6 i5 M
#include
, L% n  h$ X" _: F) Pint age(int n) {. e& c* A5 H( s' w. D9 K: y
   if (n == 1) return 10;0 O  P- c2 ^. C9 l8 N6 P+ c, m  V% c+ s
   return age(n - 1) + 2;
5 C" k+ @/ E5 U1 q! w}
$ s7 Y( k) D# \void main() {
4 q" t9 O- M- n" ^) h   printf("%d", age(5));% a' K2 X- {. P: a; P; _* a' [
}
6 L' n5 d, d' k5 D0 Y2 d

, x% A0 T; [+ z1 ]+ v9-猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半多一个。到第十天早上想再吃时,见只剩下一个桃子了。问最初有多少个桃子。
; Q: a* ^5 n. d* {/ @递归:) C/ S8 o$ Y! f1 a% U8 m
#include   s/ x: Q# n2 r! p; z$ T8 J
int peach(int n) {: Q0 `0 x: J2 J1 J
   if (n == 10) return 1;: ~1 _2 U+ C- _/ ^( ~" J
   return (peach(n + 1) + 1) * 2;
+ J1 N( m* T; y! M; z8 U}+ R5 [3 _$ P! r5 G& @
void main() {) ^5 M3 Q5 X1 ]. `
   printf("%d", peach(1));
- Z# c3 ~: F3 E, q/ r$ u}循环:
. L- ]+ C' w/ W2 j# i5 \& r7 g% U8 o#include
  s9 t$ p+ }5 Z5 Z4 A& Uvoid main() {
% [2 Z4 X' Y' N; l  g   int i, s = 1;! b7 m6 B* J# {9 S" Z7 L$ u' g
   for (i = 9; i >= 1; i--) {
$ x# H/ e: L+ b8 R; X! y       s = (s + 1) * 2;
3 L& Z; _( C# ?  }
4 H( V; \1 `% q( Y& ~" Q$ V. y$ t   printf("%d", s);- D1 F# c8 f  C% [! O8 b$ F7 Z& ~
}
% m: v- A$ |* g9 J

# q$ z  D9 E0 {: J& D/ V10-猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半多一个。第十天同样是吃了前一天的一半加一个,最后剩下一个桃子。问最初有多少个桃子。
/ T* o( O4 ^0 \* ~递归:. |) i) R' ]/ u: a: }7 `" G8 M+ n6 @
#include
9 E1 E: a. N9 ?! {% vint peach(int n) {- _5 `2 }5 N3 o4 z7 n: Y
   if (n == 11) return 1;
: a+ [3 h9 j6 x1 E. [& z   return (peach(n + 1) + 1) * 2;
: N' {3 s" c8 n8 ]! X7 n}
+ k- Z, |" i0 v: t1 a; |; ^6 nvoid main() {
+ I) [" _, {1 u& r: N, v) Z* u4 b   printf("%d", peach(1));
  u! i; C, k  v3 y% p}循环:
; @# `$ s3 ^" |' A5 o#include
" R7 J' I5 w. g: a8 Z" M  O. C; q" Jvoid main() {
0 ]& U' q, X; C% m   int i, s = 1;
, H( @1 U8 n" U) ~- I! L% K( ]   for (i = 10; i >= 1; i--) {
! N, C! v- ^# R6 {0 K: B1 A       s = (s + 1) * 2;
- k/ j8 A# U+ V% g1 h* \0 Y* J  }
  [! ?1 ]& B7 D! D   printf("%d", s);/ K( e5 c9 v/ V# q9 ~+ U
}
; B5 y/ o( b3 W
. c: k/ G6 g6 Z/ m; f- c" f
11-最大公约数:利用递归算法求两个数的最大公约数。
' \4 y$ I0 E+ ^5 ?#include
4 f+ Q: S8 p9 A+ z: Q/* 最大公约数 */
6 \/ U5 T1 l4 ~9 Z* [' |int gcd(int a, int b) {
' P% K# H( p6 D' ]5 X  L   int t;6 B- U6 Q. e9 ]
   if (a  b) {
" F, ]+ V. B/ \- T       t = a;
  C" l9 ?, x/ M: K: w       a = b;
7 I& d2 K/ @# U! {" o8 E       b = t;
/ C& t6 d6 R& a" h3 y  }
# ^3 [7 O! [$ _) I   if (b == 0) {& s; R. e4 f7 L2 T) h: s
       return a;
* ~+ p  x! d- P) Q% b: h$ U+ A  }
6 E! Q3 T+ n6 E1 g7 |$ F   return gcd(b, a % b);
, O& [6 ~9 u( R$ A7 f: ~  z" N}
4 q' ^2 I- @* q/ q* R7 Ovoid main() {
. d2 l6 b2 q3 f; W, X. q   int a, b;
" O  H7 H5 g! U1 H( V) `' o& N   scanf("%d%d", &a, &b);. y& w0 W/ m) r' j
   printf("gcd=%d", gcd(a, b));  R- u/ `: [, g0 r$ Y
}
! L: S. K- M2 K7 O2 Z0 Y7 a+ M' H
& R9 N0 Z. @. }) J
12-逆序输出:输入一个正整数,将该正整数逆序输出。
  v4 q8 [) N, d' a0 ^" Q#include
4 F5 ^8 r8 T% t4 s9 gvoid printDigit(int n) {
* ]7 D+ w$ S/ k  e# L6 ?# x9 A4 V   printf("%d", n % 10);
+ h2 M7 d% O. u9 P   if (n > 10) {; }3 v, o3 b3 \
       printDigit(n / 10);  k# ^% L2 Q! B5 ^
  }4 J5 e4 z) e! n5 f( e' F+ a2 p
}7 _6 R8 l! t! L. s! K/ X2 }
void main() {# P$ U* _' o8 v
   int n;
0 }6 ]- p+ n0 B  }& T8 |! J! u   scanf("%d", &n);
% n3 @3 d! }. m0 y4 x; n5 R   printDigit(n);
! V9 L( Y! Q1 {, q8 J  E}
9 \: X" w0 _- f7 }
) g' q1 M% [8 D$ F2 F
13-逆序输出:输入一个字符串,将该字符串逆序输出。
5 W/ A+ e7 v9 t% X: L) g; i* x#include
* k7 C5 n. f5 v' @2 ]  L+ {void printStr(char *str) {. e0 T& E2 E( U% |* S) `
   if (*str != '\0')/ O( i6 w& ~5 y' c5 C
       printStr(str + 1);
# P7 s9 }' a0 ^  }- J0 h2 s   if (*str != '\0')
/ q' M; |9 j7 {6 ]) S       printf("%c", *str);! [9 ?' H9 A- j! y( ]
}: w! S) p! g% j3 b- H- M( n
void main() {
# T0 l- O0 G( e) N. b   char str[100];& e/ \- G- J6 ^- E. Q7 q+ l  g! P3 T( L) l
   gets(str);& f4 w+ M" Q& t  K
   printStr(str);8 W- V" I2 L0 C* d- s2 Y0 {
}文章来源于网络,版权归原作者所有,如有侵权,请联系删除。  F: X( c5 E9 b$ o) v* p

! R' b* q$ S$ Z; x7 c, q3 y

qrm2jrqaqmg64020105210.jpg

qrm2jrqaqmg64020105210.jpg
  Q3 |$ ~  [. v# h$ c7 a& B0 P
" W3 O4 ~) v. g, n! c+ t' l% l
-END-' G  z+ F! n1 F) U
往期推荐:点击图片即可跳转阅读
; u+ C  D# I) k0 R8 o

4n5g0yvao5p64020105310.jpg

4n5g0yvao5p64020105310.jpg

* @; P7 p5 B' W. E) U嵌入式软件,单总线通信的分层结构设计
) s. S' T9 W$ b+ O
: _( z( _. n$ E9 E8 m. ^

wihc3o1sxbg64020105410.jpg

wihc3o1sxbg64020105410.jpg

7 y! D7 B3 a/ o% W: g嵌入式软件设计,命令与函数映射表的具体应用示例!
- n/ g2 Q- j0 I4 y7 v; x: D5 j6 |3 T1 J, R/ G( V

jp4dtpkfrci64020105510.jpg

jp4dtpkfrci64020105510.jpg
: {. K2 x- x) w4 ~2 H- J
嵌入式牛马工程师,选对工具至少可以让自己干活轻松一点!
1 n: C- M( ~) p5 j' C* X+ ?
, N/ e7 V. t+ B# N& j/ c. V5 q我是老温,一名热爱学习的嵌入式工程师
4 g6 \$ O; X1 K1 b' ^: t关注我,一起变得更加优秀!
回复

使用道具 举报

发表回复

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

本版积分规则


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