递归函数topic -C语言
0|前言
本节主要研究一种嵌套自己函数调用的方法——递归调用。
1|示例
例如,给定整数n,计算并输入阶乘n!这个项目。
阶乘函数的定义:
int factorial(int n){ int product; for (int i = 1; i <= n; i++){ product = product * i; } return product; }
这个函数思想:用一个循环把1到n的值依次相乘进行计算,得到的乘积作为结果返回。
使用for循环解决问题。
一个循环从1开始一直不断相乘,直到乘以n为止
2|用递归思想求解阶乘
用递归思想求解函数的阶乘
int factorial(int n) { if (n==1){ return 1; } return factorial(n - 1) * n; }
其实我在换个角度思考这个问题,N!可以看做n*(n-1)!与(n-1)的乘积!也可以看成是(n-1)*(n-2)!…的产物;。类比2 * 1,代码不是更简洁一点吗?
实际上,这种在函数定义中调用自身的情况叫做–递归调用
(1)头部递归
例如,定义的函数:
int factorial(int n){ if (n == 1){ return 1; } return factorial(n-1) * n; }
如果传入函数factorial()的n是5:
阶乘(5) = 5 *阶乘(4)
= 5 * 4 *阶乘(3)
= 5 * 4 * 3 *阶乘(2)
= 5 * 4 * 3 * 2 *阶乘(1)
= 5 * 4 * 3 * 2 * 1
这种递归设计,返回一个包含自己函数的递归调用,叫做过账返回。
(2)尾部递归
与头递归相对应的是尾递归,尾递归的思想是这样实现的:
int factorial(int n, int product){ if (n == 0){ return product; } product = product * n; return factorial(n-1, product); }
也取n=5来理解程序的实现细节:
factorial (5,1) ~ factorial(n, product * n) = factorial(4,1*5) = factorial(4, 5) = factorial(3, 5*4) = factorial(3, 20) = factorial(2, 20*3) = factorial(2, 60) = factorial(1, 60*2) = factorial(1, 120)] = factorial(0, 120*1) = factorial(0, 120) = 120 ~ product
小伙伴们没有发现,在尾部递归的实现中,一个函数的每一次递归调用都会将一个阶段性的结果传递给下一个被调用的函数,当最终的一般终止条件满足时,直接返回最终的结果。
本文来自枯萎○还行投稿,不代表舒华文档立场,如若转载,请注明出处:https://www.chinashuhua.cn/24/545565.html