递归:c允许函数调用它自己,这种调用过程称为递归。可以使用循环的地方通常都可以使用递归,有时用循环解决问题比较好,但有时用递归更好。递归方案更简洁,但效率却没有循环高。
阶乘:一个正整数的阶乘是从1到该整数的所有整数的乘积。例如,3 的阶乘是1*2*3,0 阶乘等于1,负数没有阶乘。
#include<stdio.h> int xunhuan(int); //循环 int DiGui(int); //递归 int main() { printf("请输入一个非负整数:"); int number=0; scanf("%d",&number); printf("\n"); printf("%d的阶乘是(循环):%d\n",number,xunhuan(number)); printf("%d的阶乘是(递归):%d\n",number,DiGui(number)); return 0; } int xunhuan(int number) { int i=1; int factorial=1; while(i <= number && number > 1){ factorial*=i; i++; } return factorial; } int DiGui(int factorial) { if(factorial > 1){ factorial*=DiGui(factorial - 1); } return factorial; }
编译一下:
循环很好理解,说一下递归,假设我们算一下 4 的阶乘:
变量 factorial = factorial * DiGui( factorial - 1 )
第一级调用后 4 = 4 * 3 // main函数调用DiGui的时候就算第一级调用
第二级调用后 3 = 3 * 2
第三级调用后 2 = 2 * 1
第四级调用后 1 不满足 if 条件,然后会逐级返回递归
第四级返回后 2 = 2 * 1 ==2
第三级返回后 3 = 3 * 2 ==6
第二级返回后 4 = 4 * 6 ==24
第一级返回就是给 main 函数了
懂了吧
然后补充几个书上认为的要点:
- 每次函数调用都会返回一次。当函数执行完毕后,控制权将被传回上一级。程序必须按顺序逐级放回,从某级 DiGui()返回上一级的 DiGui(),不能跳级回到 main()中的第一级调用。
- 递归函数中位于递归调用之前的语句,均按被调函数的顺序执行。
- 递归函数中位于递归调用之后的语句,均按被调函数相反的顺序执行。
- 虽然每级递归都有自己的变量,但是并没有拷贝函数的代码。程序按顺序执行函数中的代码,而递归调用就相当于又从头开始执行函数的代码。除了为每次递归调用创建变量外,递归调用非常类似于一个循环语句。实际上,递归有时可用循环来代替,循环也有时能用递归来代替。
- 递归函数必须包含能让递归停用的语句(就是 while 、for 、do-while 那样的循环结束条件)。
函数递归或循环 求阶乘
于 2022-04-09 20:32:28 首次发布