学点C语言(35):函数 – 递归
当前位置:以往代写 > C/C++ 教程 >学点C语言(35):函数 – 递归
2019-06-13

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

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

副标题#e#

1. 递归就是: 函数本身挪用本身

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

#include <stdio.h>

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

int main(void)
{
  prn();
  getchar();
  return 0;
}

2. 利用递归必然要有跳出的条件:

#include <stdio.h>

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

int main(void)
{
  prn(9);
  getchar();
  return 0;
}

3. 实例: 翻转字符串

#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);
  }
}


#p#副标题#e#

4. 实例: 阶乘

#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));
}

5. 实例: 整数到二进制

#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); /* 可取代上面一句 */
}

6. 分解递归:

#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 */
}

本例输出结果图:

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

阐明:

措施运行到 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, 输出了第八行, 执行完毕!

如此看来, 递归函数照旧很费内存的(有时不如直接利用轮回), 但简直很巧妙.

返回“学点C语言 – 目次”

    关键字:

在线提交作业