递归(Recursion)

递归

For some types of problems, it is useful to have functions call themselves. A recursive function is a function that calls itself either directly or indirectly through another function. Recursion is a complex topic discussed at length in upper-level computer science courses.

对于某些类型的问题,让函数调用自身很有用。 递归函数是直接或通过另一个函数间接调用自身的函数。 递归是高级计算机科学课程中详细讨论的一个复杂主题。

A recursive function is called to solve a problem. The function actually knows how to solve only the simplest case(s), or so-called base case(s) . If the function is called with a base case, the function simply returns a result. If the function is called with a more complex problem, the function divides the problem into two conceptual pieces: A piece that the function knows how to do and a piece that the function does not know how to do. To make recursion feasible, the latter piece must resemble the original problem, but be a slightly simpler or slightly smaller version of the original problem. Because this new problem looks like the original problem, the function launches (calls) a fresh copy of itself to go to work on the smaller problem --- this is referred to as recursive call and is also called the recursion step.

调用递归函数来解决问题。该函数实际上只知道如何解决最简单的情况,或所谓的基本情况。如果使用基本情况调用该函数,则该函数仅返回结果。如果针对更复杂的问题调用该函数,则该函数会将问题分为两个概念部分:函数知道如何执行的部分和函数不知道如何执行的部分。为了使递归可行,后一部分必须类似于原始问题,但是原始问题的稍微简单或稍微小的版本。因为这个新问题看起来像原始问题,所以该函数启动(调用)自身的新副本来处理较小的问题 --- 这称为递归调用 ,也称为递归步骤

斐波那契数定义:
F 0 = 0 F 1 = 1 F n = F n − 1 + F n − 2 ( n ≥ 2 , n ∈ N ) \begin{aligned} F_{0}&=0\\ F_{1}&=1\\ F_{n}&=F_{n-1}+F_{n-2}{\left(n\geq 2,n\in \mathbb{N} \right )} \end{aligned} F0F1Fn=0=1=Fn−1+Fn−2(n≥2,n∈N)

如下为递归获取第n个斐波那契数。

c 复制代码
#include <stdio.h>

unsigned long fibonacci(unsigned long n);

int main(int argc, char *argv[]) {
    unsigned long n = 0;
    printf("Enter an integer: ");
    scanf("%lu", &n);

    printf("%s%lu%s%lu\n",
            "Fibonacci(", n,
            ") = ", fibonacci(n));

    return 0;
}

unsigned long fibonacci(unsigned long n) {
    if (n == 0 || n == 1) {
        return n;
    } else {
        return fibonacci(n - 1) + fibonacci(n - 2);
    }
}
相关推荐
向阳@向远方1 小时前
第二章 简单程序设计
开发语言·c++·算法
github_czy2 小时前
RRF (Reciprocal Rank Fusion) 排序算法详解
算法·排序算法
许愿与你永世安宁2 小时前
力扣343 整数拆分
数据结构·算法·leetcode
爱coding的橙子2 小时前
每日算法刷题Day42 7.5:leetcode前缀和3道题,用时2h
算法·leetcode·职场和发展
满分观察网友z3 小时前
从一次手滑,我洞悉了用户输入的所有可能性(3330. 找到初始输入字符串 I)
算法
YuTaoShao3 小时前
【LeetCode 热题 100】73. 矩阵置零——(解法二)空间复杂度 O(1)
java·算法·leetcode·矩阵
Heartoxx3 小时前
c语言-指针(数组)练习2
c语言·数据结构·算法
大熊背3 小时前
图像处理专业书籍以及网络资源总结
人工智能·算法·microsoft
满分观察网友z4 小时前
别怕树!一层一层剥开它的心:用BFS/DFS优雅计算层平均值(637. 二叉树的层平均值)
算法
杰克尼5 小时前
1. 两数之和 (leetcode)
数据结构·算法·leetcode