递归算法思想

  1. 递归算法就是在程序中不断反复调用自身来达到求解问题的方法。这里强调的重点是调用自身。这就需要等待求解的问题能够分解为相同问题的一个子问题。这样,通过多次递归调用,便可以完成求解。
  2. 递归调用是一个函数在它的函数体内调用它自身的函数调用方式,这种函数也称为"递归函数”。在递归函数中,主调函数同时又是被调函数。执行递归函数将反复调用其自身,每调用一次就进入新的一层。
  3. 函数的递归调用可分为以下两种情况。
    直接递归:即在函数中调用函数本身。
    间接递归:即间接地调用一个函数,如func_a调用func_b,func_b又调用func_a。间接递归使用得不多。
  4. 编写递归函数时,必须使用if语句强制函数在未执行递归调用前返回。否则,在调用函数后,它将永远不会返回,这是个很容易犯的错误。
  5. 了解递归函数的设计方法和工作原理后,接下来对递归的优缺点进行总结:
  • 递归函数的优点:程序代码更简洁清晰,可读性更好。有些算法用递归表示要比用循环表示简洁精练,特别是与人工智能有关的问题,更适合使用递归方法,例如八皇后问题、汉诺塔问题等。有些算法用递归能实现,而用循环却不一定能实现。
  • 递归函数的缺点: 大部分递归例程没有明显地减少代码规模和节省内存空间,递归形式比非递归形式的运行速度要慢些。 这是因为附加的函数调用延长了时间,例如需要执行一系列的压栈出栈等操作。如果递归层次太深,还可能导致堆栈溢出。但在许多情况下,速度的差别并不是很明显。

二、示例:计算阶乘

递归算法常用于一些数学计算,或者有明显递推性质的问题。

#include <stdio.h>								//头文件

long fact(int n);								//函数声明

void main()
{
    int i;										//声明变量

    printf("请输入要求阶乘的一个整数:"); 
    scanf("%d",&i);								//输入数据
    printf("%d的阶乘结果为:%ld\n",i,fact(i)); 	//调用函数
}

long fact(int n)								//求阶乘函数
{
    if(n<=1)
        return 1;
    else
        return n*fact(n-1);						//递归
}

猜你喜欢

转载自blog.csdn.net/qq_42815188/article/details/86532934