函数递归
#include <stdio.h>
#include <stdlib.h>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
//函数声明
void diguifunc();
void qtfunc1();
void qtfunc2();
void qtfunc3();
int dg_jc();
int main(int argc, char *argv[]) {
//函数的递归调用
diguifunc();
//调用栈:(一块系统分配给咱们这个程序有特殊用途的内存)把形式参数 函数调用关系 局部变量
//这段内存是有限的 一旦超过了这个这个内存大小 就会出现崩溃现象
//因为这种递归调用产生死循环问题 所以这种自己调用自己的方式 必须要有一个出口,这个出口也叫递归结束条件
//递归调用的出口范例
//计算5的阶乘:5! 出口肯定是1!
//dg_jc(5) = dg_jc(4)*5 递归--
//dg_jc(4) = dg_jc(3)*4
//dg_jc(3) = dg_jc(2)*3
//dg_jc(2) = dg_jc(1)*2
//dg_jc(1) = 1; 这里是出口条件
dg_jc(5);
//递归优缺点:
//优点:
//代码少,代码看起来简洁,精妙
//虽然简洁 但是不好理解
//层次太深的话 调用栈(内存)太深 可能回溢出 出现这种情况下 那么说明不能用递归解决该问题
//有些问题用不用递归都行
//有些是必须的://汉诺塔
//递归的直接或者间接调用:
//递归函数直接调用:
//调用递归:函数的f的过程 f函数有调用自己 这就是直接调用
//间接调用:调用函数f1的过程中要调用f2函数 然后f2函数又要调用f1函数
//
}
//递归函数:就是自己调用自己
//执行函数将反复的调用自身 每调用自己一次就进入了一个新层
//必须得有出口:就是递归的结束条件
void diguifunc(){
printf("This is diguifunction\n");
int a = dg_jc(5);
printf("%d\n",a);
}
//范例:
//n! 用递归函数代码
int dg_jc(int n){
int result;//保存结果
if(n == 1){
return 1; //递归调用的出口
}else{
result = dg_jc(n-1) * n;
}
return result;
}
//函数定义
void qtfunc1(){
int temp = 150; //局部变量:在函数内部定义的变量,当整个函数执行完后,局部变量所占的内存被系统自动回收
printf("Q1开始执行\n");
qtfunc2();
printf("Q1执行结束\n");
}
void qtfunc2(){
printf("Q2开始执行\n");
qtfunc3();
printf("Q2执行结束\n");
}
void qtfunc3(){
printf("Q3开始执行\n");
printf("Q3执行结束\n");
}