c/c++ c语言递归调用

递归调用

c/c++ c语言递归调用


  • 求 1 + 2 + 3 …….n的和;
  • 递归的思想分析下:
    • 1到n,假设 [1到n-1]的和知道了,结果+n = [1,n]的结果;
    • 依此类推,得到一个最小规模问题的解决,那么后面所有的都知道了;
    • c/c++ c语言递归调用
  • 运行模型
    • c/c++ c语言递归调用
    • c/c++ c语言递归调用
  • 假设小一级规模得到解决,推导出当前规模的问题解;
  • 问题规模转换越来越小,最小规模的问题,我们返回一个值,
    • c/c++ c语言递归调用
  • 随着函数调用,使得问题规模不断减少的同时,栈在往下面一直增加;
  • 直到遇到最小规模的问题得到解决,栈才不会增加了,才会依次返回;

递归秘诀

c/c++ c语言递归调用


递归过程解析

  • 随着问题规模的大小1000的,10000的,同样的代码对栈的消耗是不一样的
  • 对栈的大小,它不是鲁棒的;(物理学的一个概念)
  • 普通的算法,对栈的消耗不会随着问题规模的变化而变化;
    • c/c++ c语言递归调用
  • 递归算法,问题的规模越大,递归的次数越大,那么对栈的消耗越大;
  • 每个应用程序的栈的大小是固定的,递归的时候层次不宜过多,解决规模不大的问题;
  • c/c++ c语言递归调用
  • 所以只能解决规模不大的问题;
  • 数学归纳法的思想,能够方便我们写出复杂的逻辑;
  • 程序中栈的大小是可以由编译器来配置,那么编译出来的程序,就会使用你设置的栈的大小,默认是1MB;
  • 如果实在要用递归,然而栈不够用,可以通过修改编译器来改变栈的大小;
    • c/c++ c语言递归调用
    • c/c++ c语言递归调用
  • 栈是可以修改大小的;

递归优点与缺点

c/c++ c语言递归调用


总结

c/c++ c语言递归调用


源代码