递归的个人总结

递归函数(递去、回归)是函数不断的调用自己;

可以按照如下来理解:func1中调用func2,func2中调用func3;

func3函数返回了,继续执行func2中的语句;func2执行完了,继续执行func1之后的语句;fun1执行结束。

复制代码
void func3()
{
    printf("this is  func3\n");
    return;
}
void func2()
{
    func3();
    printf("this is  func2\n");
    return;
}
void func1()
{
    func2();
    printf("this is  func1\n");
    return;
}
int  main()
{
    func1();
    return 0;
}

从上图中可以看出,最后调用的函数先执行完(也是递归中回归的过程),即:this is func3先打印输出。

递归算法(英语:recursion algorithm)是指一种通过重复将问题分解为同类的子问题而解决问题的方法。

递归的三要素:

1.明确函数的功能

2.递归的结束条件

3.函数的等价关系

接下来利用n nn阶乘来讲解这三个条件

任何大于等于1 的自然数n nn阶乘表示方法:

n ! = n × ( n − 1 ) ! ( n > 1 ) 0 ! = 1 ( n = 0 ) n!=n \times(n-1)! \quad (n > 1) \\ 0! = 1 \quad (n = 0)

n!=n×(n−1)!(n>1)

0!=1(n=0)

1.1明确函数的功能

明确我们要写的函数的功能是实现n nn的阶乘,定义函数如下:

// 定义n阶乘函数

public int factorial(int n){

}

1.2递归的结束条件

由阶乘的表示方法可以看出当n = 0 n = 0n=0时是阶乘的最小值,此时结束继续往下计算阶乘,可以把n = 0 n = 0n=0当做递归的结束条件。同样,当n = 1 n = 1n=1时,1 ! = 1 1! = 11!=1也可以作为递归的结束条件。

// 定义n阶乘函数

public Integer factorial(int n){

// 递归的结束条件

if (n == 1) return 1;

}

1.3函数的等价关系

第三要素就是,我们要不断缩小参数的范围,缩小之后,我们可以通过一些辅助的变量或者操作,使原函数的结果不变。

由阶乘的表达式可以看出n nn的阶乘与n − 1 n -1n−1阶乘存在的关系式为n ! = n × ( n − 1 ) ! ( n > 1 ) n!=n \times(n-1)! \quad (n > 1)n!=n×(n−1)!(n>1)若已知n − 1 n -1n−1的阶乘,记为f ( n − 1 ) f(n - 1)f(n−1),则当前的n nn的阶乘可以记为f ( n ) = n × f ( n − 1 ) ( n > 1 ) f(n) = n \times f(n -1)\quad (n > 1)f(n)=n×f(n−1)(n>1)

综上递归的三个要素可以得出求n nn阶乘的递归函数为

// 定义n阶乘函数

public Integer factorial(int n){

// 递归的结束条件

if (n == 1) return 1;

return n * factorial(n - 1);

}


原文链接:https://blog.csdn.net/qq_38670588/article/details/108206613

相关推荐
东风破_4 小时前
danci 项目(三):从 JSON 数据到 AI Coding,真实项目里的数据清洗、Prompt 和工程规范
前端·后端·node.js
东风破_5 小时前
danci 项目(一):从需求到架构,一个单词学习系统为什么会这样设计
前端·后端·node.js
蒲公英eric5 小时前
从客户端到服务端:DVWA DOM 型 XSS 模块完整漏洞分析教程
前端·web安全·ai·xss·dvwa·ai安全
单线程_015 小时前
从案例分析 Vue3 Tokenizer+Parser 源码三
前端·javascript·vue.js
顶点多余6 小时前
那些在算法中适合巩固的知识点---1
java·前端·算法
Setsuna_F_Seiei6 小时前
前端转型 Agent 开发 03 之 Agent Tools - 给 Agent 装上手脚
前端·agent·ai编程
jay神6 小时前
【计算机毕业设计】基于SpringBoot的程序教学辅助系统
java·前端·vue.js·spring boot·后端·毕业设计·课程设计
Julien20046 小时前
调查和解决 SELinux 问题
linux·运维·服务器·网络·学习方法
2601_962074688 小时前
自己编译RustDesk,并将自建ID服务器和key信息写入客户端
运维·服务器
kyriewen9 小时前
我装了30多个Skill,给AI安排了8个岗位
前端·javascript·ai编程