《C Primer Plus》读书笔记——递归

简介: 递归的原理一个函数调用其本身,此调用过程为递归(recursion)。递归的使用举个栗子:/*用来测试UpAndDown函数的驱动程序*/#include void UpAndDown (int);int main(void){ UpAnd...

递归的原理

一个函数调用其本身,此调用过程为递归(recursion)。

递归的使用

举个栗子:

/*用来测试UpAndDown函数的驱动程序*/

#include <stdio.h>

void UpAndDown (int);

int main(void)
{
    UpAndDown(1);
    return 0;
}

void UpAndDown (int n)
{
    printf("Level %d: n location %p\n" , n, &n);
    if (n < 5)
        UpAndDown(n+1);
    printf("LEVEL %d: n location %p\n" , n, &n);
}

输出如下:

输出如下:

递归的基本原理

  • 每级递归都使用其私有变量(如例子中的n)

  • 每次函数调用都返回前一级(调用他那级)递归

  • 递归函数中,位于递归调用前的语句和各级被调函数具有相同执行顺序

  • 递归函数中,位于递归调用后的语句和各级被调函数具有相反执行顺序

  • 每级递归会从头执行而不是复制其函数代码,所以一般可代替循环语句。

  • 递归函数必须包含可以终止递归调用的语句(如if)。

尾递归

最简单的递归形式。

把递归调用语句放在函数结尾(return语句之前)。

举个栗子:
计算n的阶乘

long fact (int n) // 使用循环计算阶乘,占内存少,执行快
{
    long ans;

    for(ans = 1; n>1; n--)
        ans *= n;
    return ans;
}

long rfact (int n) // 使用递归计算阶乘,仅作尾递归展示、入门long ans;

    if(n > 0)
        ans = n * rfact(n-1);
    else
        ans = 1; //1.零的阶乘;2.结束递归。
    return ans;
}

递归和反向计算

将一个整数转换成二进制形式。

void ToBinary (unsigned long n) // 简单须存数组版递归
{
    int r;
    r = n % 2;
    if(n >= 2)
        ToBinary(n / 2);
    putchar('0' + r); //or: putchar(r ? '1' : '0')

    return;
}

递归的优缺点

优点
算法简单
缺点
占内存,难于阅读和维护

举个栗子:斐波那契数列:第一、二个数字都是1,而后续的每个数字是其前两个数字之和。1、1、2、3、5、8、13……

long Fibonacci (int n)
{
    if(n > 2)
        return Fibonacci(n-1) + Fibonacci(n-2);
    else
        return 1;
}

双重递归。
致命弱点:每级调用变量数以指数递增!

Something interesting …

main( )也可以被自身递归调用或其他函数调用,尽管用得少。

目录
相关文章
|
6月前
|
存储 编译器 程序员
C++ Primer Plus 第6版 读书笔记(10) 第十章 类与对象
C++ Primer Plus 第6版 读书笔记(10) 第十章 类与对象
37 0
|
6月前
|
存储 算法 编译器
C++ Primer Plus 第6版 读书笔记(8)第 8章 函数探幽(二)
C++ Primer Plus 第6版 读书笔记(8)第 8章 函数探幽(二)
32 1
|
6月前
|
存储 Java 编译器
C++ Primer Plus 第6版 读书笔记(8)第 8章 函数探幽(一)
C++ Primer Plus 第6版 读书笔记(8)第 8章 函数探幽(一)
23 0
|
12月前
|
存储 人工智能 算法
C++ Primer Plus 第6版 读书笔记(7)第 7 章 函数——C++的编程模块
乐趣在于发现。仔细研究,读者将在函数中找到乐趣。C++自带了一个包含函数的大型库(标准 ANSI 库加上多个 C++类),但真正的编程乐趣在于编写自己的函数;另一方面,要提高编程效率,本章和第 8 章介绍如何定义函数、给函数传递信息以及从函数那里获得信息。
130 0
|
12月前
|
存储 自然语言处理 C语言
C++ Primer Plus 第6版 读书笔记(5)第5章 循环和关系表达式
如本章前面所述,for 循环是一种处理数组的工具。下面进一步讨论如何使用嵌套 for 循环中来处理二 维数组。首先,介绍一下什么是二维数组。到目前为止,本章使用的数组都是一维数组,因为每个数组都可以看作是一行数据。二维数组更像是一个表格—既有数据行又有数据列。例如,可以用二维数组来表示 6 个不同地区每季度的销售额,每一个地区占一行数据。也可以用二维数组来表示 RoboDork 在计算机游戏板上的位置。
96 0
|
存储
《C Primer Plus》读书笔记——存储类、链接和内存管理
背景 距离上次写读书笔记的日子已有半个月了。这段时间一直在做摄像头直立平衡车,也把《C Primer Plus》的中级部分扫了一遍。现在做赛道算法识别遇到瓶颈了,就想把读书笔记补回来。
1089 0
|
6月前
|
存储 安全 编译器
[笔记]读书笔记 C++设计新思维《一》基于策略的类设计(下)
[笔记]读书笔记 C++设计新思维《一》基于策略的类设计(下)
|
6月前
|
存储 算法 Java
[笔记]读书笔记 C++设计新思维《二》技术(Techniques)(二)
[笔记]读书笔记 C++设计新思维《二》技术(Techniques)(二)
|
6月前
|
安全 Java C++
[笔记]读书笔记 C++设计新思维《一》基于策略的类设计(上)
[笔记]读书笔记 C++设计新思维《一》基于策略的类设计
|
6月前
|
存储 关系型数据库 编译器
C++ Primer Plus 第6版 读书笔记(9)第 9章 函数——内存模型和名称空间
C++ Primer Plus 第6版 读书笔记(9)第 9章 函数——内存模型和名称空间
61 1