递归
守护砂之国泰裤辣
既然已经走这么远了,那么不妨再走远一点...
展开
-
C语言递归算法系列_ 逆序和正序输出一个整数的每位数 (1)
这是一个简单的问题,也是递归里面比较典型的例子。那么从这里开始我们的递归之旅。参考书籍《数据结构与算法分析 C语言描述》 《Java程序设计 基础、编程抽象与算法策略》 先谈谈递归,递归的一般解释为将问题分解为更简单的具有类似解决方法子问题,更小子问题解决后将结果一步步返还给原始问题。这个过程通俗来讲就是函数自己调用自己。用递归解决问题的过程体现了分而治之的算法策略。递归解题的一般步原创 2018-02-05 00:20:24 · 13152 阅读 · 3 评论 -
Java递归——生成排列问题
排列问题描述:如输入字符串“ABC”,调用递归函数将生成一个排列集合:{"ABC", "ACB", "BAC", "BCA", "CAB", "CBA"}也就是3!=6个非空子集。而对于字符串“AABB”,那么只会产生6种排列:{"AABB", "ABAB", "ABBA", "BAAB", "BAB原创 2018-02-08 17:56:21 · 439 阅读 · 0 评论 -
Java递归解决子集求和问题
子集求和问题属于难以高效解决的计算问题中的一类,用于以信息保密为目标的应用中。子集求和问题的定义为:给定一个整数集和目标值,确定是否可以找到这些整数的一个子集,使其总和等于指定的目标值。比如给定集合{-2,1,3,8}和目标值7,那么问题的答案就是是,因为有子集{-2,1,8}加起来对于7。但是如果目标值是5,答案就为否。所以我们很容易定义出递归函数原型:boolean subsetSumExis...原创 2018-02-08 11:52:16 · 2572 阅读 · 0 评论 -
C语言递归算法系列_汉诺塔(6)
这次我们接触一个抽象程度更高的递归问题,hanoi塔。问题描述为:汉诺塔是由三根杆子A,B,C组成的。A杆上有N个(N>1)穿孔圆盘,盘的尺寸由下到上依次变小。要求按下列规则将所有圆盘移至C杆:每次只能移动一个圆盘;大盘不能叠在小盘上面。这个问题在显示中还真没什么用处,但是基本讲解递归问题就会把它拿出来。既然是递归,那我们还是按照分析递归问题的步骤来。我们设定这样的函数原型void hano...原创 2018-02-08 11:22:11 · 490 阅读 · 2 评论 -
C语言递归算法系列_循环实现逆序和正序输出一个整数的每位数 (2)
在上一篇中,我们用递归实现输出一个整数的每位数,这次我们用循环来实现这,并且对比两者的特点。话不多说,先上代码(没怎么优化代码,尤其是正序输出的那个函数,用到了三个循环)#include <stdio.h>void order_print(int n){ int nCount = 1, temp = n; while(temp / 10) { nC...原创 2018-02-08 10:51:22 · 3568 阅读 · 0 评论 -
C语言递归算法系列_尾递归求阶乘和斐波那契数列(5)
我们将以两个经典问题为例子,升级我们的递归成为尾递归。尾递归顾名思义就是尾处递归,其实不然。就我的理解,就是将递归函数多加了几个参数,并将结果保存在参数中,这就略去了函数回调的代价。以往我们求斐波那契(假设从0开始,0,1,1,2......),基本就是按照递归式子来求:if (n == 1) return 0;else if (n == 2) return 1;return fib(n -...原创 2018-02-08 10:49:46 · 883 阅读 · 0 评论 -
C语言递归算法系列_打印杨辉三角 循环与递归同时使用(4)
杨辉三角又名Pascal三角。其结构存储在一个二维数组里可以当成一个下三角矩阵。其核心是 每行的行首元素和对角线元素(行列坐标相等)的情况下存储数字1,其它情况下为其腰上的两个元素之和。下面我们就从循环和递归两种方法打印杨辉三角。1.循环,唯一遇到的困难就是二维数组传参,我为了简便,用了全局变量!#include <stdio.h>int a[10][10];void cyan...原创 2018-02-08 10:37:23 · 1760 阅读 · 0 评论 -
c语言递归求1+2+...加到100的和
有些函数式编程语言是没有循环的,如Lisp。那么高斯同学的1+2+3+...+100如何用递归求解呢?下面给出递归算法求高斯同学的5050:#include <stdio.h>int add(int n){ if (n < 1) return 0; return n + add(n - 1);}int main(void){ ...原创 2018-02-13 17:50:19 · 14568 阅读 · 2 评论 -
分而治之求x的n次方
我们可以很容易地编写出下面的递归方法:double raiseToPower(double x, int n)用它来计算x^n,基于递推式: x^n = x * x^(n - 1)这种策略会导致该实现在线性时间内运行。如果我们基于以下式子: x^(2 * n)...原创 2018-02-13 17:37:34 · 410 阅读 · 0 评论 -
C语言递归算法系列_辗转相除(欧几里得法)求最大公约数(3)
这一次我们同时使用递归与循环解决问题。求最大公约数,最经典的方法莫过于辗转相除法,也叫欧几里得法。其计算原理依赖于下面的递推式: gcd(m, n) = gcd(n, m mod n)整数m、n的最大公约数等于n和m除以n的余数的最大公约数。 开始我们的递归分析:1.简单情况, m % n == 0, 此时n就是m和n的最大公约数,直接返回。2原创 2018-02-05 16:43:05 · 4290 阅读 · 0 评论 -
二分查找 迭代方法与递归方法——java实现
相比较于线性查找,二分查找算法是查找数组中元素的高效方法,它生成一棵二分查找树,复杂度为O(log2n)。当然前提是数组有序。import java.util.Scanner;public class BinarySearch { public static int binarySearch(int[] arr, int purpose) { int bottom = 0;...原创 2018-06-03 14:02:54 · 535 阅读 · 0 评论