算法入门——递归

思想:直接或者间接的调用自身来进行下一步计算。

一般的实现过程:通过函数或者子过程,直接或间接的调用函数或子过程,来进行计算。

要求

每一次的循环调用,求解问题的规模必须要有所缩小。

相邻的两次循环调用,得有紧密的联系,通常,前一次的调用结果是后一次调用的输入。

必须有一个出口,即递归循环结束条件。

注意:递归调用的算法的运行效率通常比较低,调用次数过多可能会造成栈溢出。

实例:求阶乘

#include<stdio.h>
int fact(int n);
void main(){
 int i;
 printf("input:");
 scanf("%d",&i);
 printf("%d的阶乘结果为:%d",i,fact(i));
 getch();
}

int fact(int n){
 if(n<=1)
  return 1;
 else
  return fact(n-1)*n;
}

分析:递归的算法思想其实不难,简单的说:就是重复的调用自身来求解问题。但选择递归的时机很重要,有些复杂的问题,是可以用递归简单的解决。这就需要你仔细的分析。

运行过程

当程序运行到 printf("%d的阶乘结果为:%d",i,fact(i))的时候,开始调用函数fact(i)。在函数fact()里,n=i;判断n是否小于等于1(这很重要,是递归结束的条件),小于就返回1,否则返回fact(n-1)*n,也就是再一次的调用的函数fact(),而且函数的参数小1,这满足的每一次的调用,问题规模必须有所缩小的递归原则。再一次的调用后,接着判断,然后又调用,又判断,直到n小于等于1。这时候,通过若干次的递归调用,函数的返回值会越来越大,直到得出结果。

时间: 2024-12-10 17:30:07

算法入门——递归的相关文章

算法入门———递归

递归:在定义自身的过程中,直接或间接调用自身的一种算法 最简单的递归示例: 阶乘 求n! 分析: n!等价于 n(n-1)! 这是一个典型的递归算法题 public int recursion(int n){ if(n==0){ return 1; }else{ return n*recursion(n-1); } } /*   题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月 后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?*/ 分析: 其实

算法入门心得

最近看了刘汝佳写的算法入门经典  感觉自己的基础实在太烂了  所以总结了一些我们比较容易犯的错误给大家看看(大牛就不要看了O(∩_∩)O) 1.浮点数:两个整数计算的是浮点数的时候一定要把整数先化为浮点数  5-0.1计算机先把5变5.0之后再进行计算的 2.异或运算:这个是个很神秘的东西如果要在一个数组中找一个只有一个的数那么就可以用异或了 异或也可以用在两个数的交换a = a^b; b = a ^ b; a = a ^ b;就实现转换了 自己异或自己等于0: 3.逻辑运算符都是短路运算符a|

POJ-1061 青蛙的约会-数论扩展欧几里德算法入门及推导

Description 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止.可是它们出发之前忘记了一件很重要的事情,既没有问清楚对方的特征,也没有约定见面的具体位置.不过青蛙们都是很乐观的,它们觉得只要一直朝着某个方向跳下去,总能碰到对方的.但是除非这两只青蛙在同一时间跳到同一点上,不然是永远都不可能碰面的.为了帮助这两只乐观的青蛙,你被要求写一个程序来判断这两只青蛙是否能够碰面,会在什么时候碰面. 我们把这

算法入门之归并排序(自顶向下方法)

归并排序原理: 归并排序用到的是分治思想,即把一个大问题分成两个小问题,然后把一个小问题再分为两个更小的小问题,从最小的问题开始解决,然后把小问题的结果进行整合,最终解决大问题,这种思想是自顶向下的方法,特点是先进行递归,最终进行排序,在之后的快速排序中可以看到,快速排序特点是先进行排序,后进行递归 算法实现如下: function less($m, $n) { return $m < $n; } function merge(&$a, $lo, $mid, $hi) { $i = $lo;

【算法入门】深度优先搜索(DFS)

深度优先搜索(DFS) [算法入门] 1.前言深度优先搜索(缩写DFS)有点类似广度优先搜索,也是对一个连通图进行遍历的算法.它的思想是从一个顶点V0开始,沿着一条路一直走到底,如果发现不能到达目标解,那就返回到上一个节点,然后从另一条路开始走到底,这种尽量往深处走的概念即是深度优先的概念. 你可以跳过第二节先看第三节,:) 2.深度优先搜索VS广度优先搜索 2.1演示深度优先搜索的过程还是引用上篇文章的样例图,起点仍然是V0,我们修改一下题目意思,只需要让你找出一条V0到V6的道路,而无需最短

数据结构与算法入门-算法介绍(python版本)

//2020.02.29数据结构与算法入门(python版本)第1章 评判算法的优劣指标有哪些?课时1:算法的基本概念 1.算法Algorithm是一个计算过程,是指解决一个问题的方法.2.数据结构是指数据存储的一种结构方式,是静态的.3.程序=数据结构+算法(尼古拉斯凯奇说过的一句著名的话).课时2:时间复杂度介绍 1.估计不同算法运行的快慢方式:时间复杂度2.时间复杂度是指:用来评估算法运行效率的一个式子(单位),与电脑的配置无关,与算法的运行量无关: 3.时间复杂度的表示方法一般使用O(n

Java数据结构和算法之递归

四.递归 递归是函数调用自身的一种特殊的编程技术,其应用主要在以下几个方面:   阶乘 在java当中的基本形式是: Public  void  mothed(int n){//当满足某条件时: Mothed(n‐1): } 递归二分查找 Java二分查找实现,欢迎大家提出交流意见.  /** *名称:BinarySearch *功能:实现了折半查找(二分查找)的递归和非递归算法. *说明: *     1.要求所查找的数组已有序,并且其中元素已实现Comparable<T>接口,如Integ

数据结构与算法5: 递归(Recursion)

数据结构与算法5: 递归(Recursion) 写在前面 <软件随想录:程序员部落酋长Joel谈软件>一书中<学校只教java的危险性>一章提到,大学计算机系专业课有两个传统的知识点,但许多人从来都没搞懂过,那就是指针和递归.我也很遗憾没能早点熟练掌握这两个知识点.本节一些关键知识点和部分例子,都整理自教材或者网络,参考资料列在末尾.如果错误请纠正我. 思考列表: 1)什么程序具有递归解决的潜质? 2)递归还是非递归算法,怎么选择? 3)递归程序构造的一般模式 1.递归定义 首要引

第二章 算法入门 合并排序

在第二章中难的算法不多,接下来我会把稍微复杂一点的算法整理一下 #include <iostream> using namespace std; void mergeSort(int *A,int left,int mid,int right) { int *L=new int[mid-left+1]; int *R=new int[right-mid+1]; int i,j; for(i=0;i<mid-left+1;i++) { L[i]=A[left+i]; } for (j=0;