学点 C 语言(35): 函数 - 递归

180it 2020-03-05 AM 2743℃ 0条

学点 C 语言(35): 函数 - 递归

  1. 递归就是: 函数自己调用自己

这是一个最简单的递归, 不过它会一直执行, 可用 Ctrl+C 终止.

include <stdio.h>

void prn(void) {

printf("C++Builder 2009\n");
prn();  /* 自调用; 注意它会一直执行, 可用 Ctrl+C 终止执行 */

}

int main(void)
{

prn();
getchar();
return 0;

}

  1. 使用递归一定要有跳出的条件:

    include <stdio.h>

void prn(int num) {

printf("%d\n", num);
if (num > 0) prn(--num);  

}

int main(void)
{

prn(9);
getchar();
return 0;

}

  1. 实例: 翻转字符串

    include <stdio.h>

void revers(char *cs);

int main(void)
{

revers("123456789");

getchar();    
return 0;

}

void revers(char *cs)
{

if (*cs)
{ 
    revers(cs + 1);
    putchar(*cs);
}

}

  1. 实例: 阶乘

    include <stdio.h>

int factorial(int num);

int main(void)
{

int i;
for (i = 1; i <= 9; i++)
printf("%d: %d\n", i, factorial(i));

getchar();    
return 0;

}

int factorial(int num)
{

if (num == 1)
    return(1);
else
    return(num * factorial(num-1));

}

  1. 实例: 整数到二进制

    include <stdio.h>

void IntToBinary(unsigned num);

int main(void)
{

IntToBinary(255); /* 11111111 */
getchar();
return 0;

}

void IntToBinary(unsigned num) {

int i = num % 2;
if (num > 1) IntToBinary(num / 2);
putchar(i ? '1' : '0'); 

// putchar('0' + i); / 可代替上面一句 /
}

  1. 剖析递归:

    include <stdio.h>

void prn(unsigned n);

int main(void)
{

prn(1);
getchar();
return 0;

}

void prn(unsigned n) {

printf("%d: %p\n", n, &n);  /* A */
if (n < 4) 
    prn(n+1);               /* B */
printf("%d: %p\n", n, &n);  /* C */

}

本例输出效果图:

o_812041.png

分析:
程序运行到 A, 输出了第一行.
此时 n=1, 满足 < 4 的条件, 继续执行 B 开始了自调用(接着会输出第二行); 注意 n=1 时语句 C 还有待执行.
...如此循环, 一直到 n=4, A 可以执行, 但因不满足条件 B 执行不了了; 终于在 n=4 时得以执行 C.
但此时内存中有四个函数都等待返回(分别是 n=1、2、3、4 时), 咱们分别叫它 f1、f2、f3、f4.
f4 执行 C 输出了第五行, 函数返回, 返回给 f3(此时 n=3), f3 得以继续执行 C, 输出了第六行.
f3 -> f2 -> 继续 C, 输出了第七行.
f2 -> f1 -> 继续 C, 输出了第八行, 执行完毕!

如此看来, 递归函数还是很费内存的(有时不如直接使用循环), 但的确很巧妙.

支付宝打赏支付宝打赏 微信打赏微信打赏

如果文章或资源对您有帮助,欢迎打赏作者。一路走来,感谢有您!

标签: none

学点 C 语言(35): 函数 - 递归