递归详解(四)

 1 public class A {
 2     static int k=0;
 3     static int temp_k=0;
 4     static int p=0;
 5     static int q=0;
 6     public static void main(String args[]) {
 7         char[] ss = { ‘1‘, ‘2‘, ‘3‘,‘4‘,‘5‘,‘1‘, ‘2‘, ‘3‘,‘4‘,‘5‘};
 8         permutation(ss, 0);
 9         if(temp_k == k)  {
10             System.out.println(k);
11             System.out.println(p);
12             System.out.println(q);
13         }
14     }
15     public static void permutation(char[] ss, int i) {
16
17         if (ss == null || i < 0 || i > ss.length) {
18             return;
19         }
20         if (i == ss.length) {
21             String a = new String(ss);
22             k++;
23             temp_k = k;
24             if(k==3628800)
25             System.out.println(a);
26         } else {
27             for (int j = i; j < ss.length; j++) {
28                 char temp = ss[j];// 交换前缀,使之产生下一个前缀
29                 ss[j] = ss[i];
30                 ss[i] = temp;
31                 p++;
32                 permutation(ss, i + 1);
33                 q++;
34                 temp = ss[j]; // 将前缀换回来,继续做上一个的前缀排列.
35                 ss[j] = ss[i];
36                 ss[i] = temp;
37             }
38         }
39     }
40 }

对10个数进行排列,k存放总排列情况的个数,p、q分别存放入栈和出栈的次数。顺便打印出最后一种排列,结果:

5123451234
3628800
9864100
9864100

排列总数为10!
计算规律如下:

n 1 2 3 4 5 6       10
k 1 2 6 24 120 720       10!
p 1 4 15 64 325 1956       9864100

可见算法效率比较低,递归入栈的次数远大于全排列的次数,随着n值的增加,p/n趋近于自然对数e。

时间: 2024-12-28 02:37:18

递归详解(四)的相关文章

Android基础入门教程——8.3.7 Paint API之—— Xfermode与PorterDuff详解(四)

Android基础入门教程--8.3.7 Paint API之-- Xfermode与PorterDuff详解(四) 标签(空格分隔): Android基础入门教程 本节引言: 上节我们写了关于Xfermode与PorterDuff使用的第一个例子:圆角&圆形图片ImageView的实现, 我们体会到了PorterDuff.Mode.DST_IN给我们带来的好处,本节我们继续来写例子练练手, 还记得Android基础入门教程--8.3.2 绘图类实战示例给大家带来的拔掉美女衣服的实现吗? 当时我

LinearLayout详解四:彻底解决软键盘遮挡输入框的问题

之前把预备知识都介绍完了,话说学以致用,接下来我们要通过重载LinearLayout类来解决软键盘覆盖的问题. 首先阐述一下这个问题,如下图所示: 然后看挡住输入框的情况 然后我们给出xml的源代码: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:lay

sas数据读取详解 四种读取数据方式以及数据指针的位置 、读取mess data的两个小工具、特殊的读取技巧、infile语句及其选项(dsd dlm missover truncover obs firstobs)、proc import、自定义缺失值

(The record length is the number of characters, including spaces, in a data line.) If your data lines are long, and it looks like SAS is not reading all your data, then use the LRECL= option in the INFILE statement to specify a record length at least

spark2.x由浅入深深到底系列六之RDD java api详解四

学习spark任何的知识点之前,先对spark要有一个正确的理解,可以参考:正确理解spark 本文对join相关的api做了一个解释 SparkConf conf = new SparkConf().setAppName("appName").setMaster("local"); JavaSparkContext sc = new JavaSparkContext(conf); JavaPairRDD<Integer, Integer> javaPa

android动画详解四 创建动画

· 使用ValueAnimator进行动画 通过指定一些int, float或color等类型的值的集合,ValueAnimator 使你可以对这些类型的值进行动画.你需通过调用ValueAnimator 的某个工厂方法来获得一个ValueAnimator 对象,比如:ofInt(), ofFloat(), 或 ofObject().例如: ValueAnimator animation = ValueAnimator.ofFloat(0f, 1f); animation.setDuration

[数据库事务与锁]详解四: 数据库的锁机制

注明: 本文转载自http://www.hollischuang.com/archives/898 数据库的读现象浅析中介绍过,在并发访问情况下,可能会出现脏读.不可重复读和幻读等读现象,为了应对这些问题,主流数据库都提供了锁机制,并引入了事务隔离级别的概念. 并发控制 在计算机科学,特别是程序设计.操作系统.多处理机和数据库等领域,并发控制(Concurrency control)是确保及时纠正由并发操作导致的错误的一种机制. 数据库管理系统(DBMS)中的并发控制的任务是确保在多个事务同时存

函数通信和递归详解

一 函数通信 函数通信就是不同函数之间如何实现变量的共享交换.实现方法大概有三种:参数传递,返回值,全局变量.下面举例来说明这3中方法. 1 参数传递就是把函数名当做另外一个函数的参数来传递,这样2个函数就可以相互通信,为了方便使用了JavaScript语法. function fn1(str){ console.log(str); }; function fn2(fn1){ fn1("Hello World"); }; fn2(fn1); 上面代码fn2可以利用参数fn1,在自己的函

Android开发之基本控件和详解四种布局方式

Android中的控件的使用方式和iOS中控件的使用方式基本相同,都是事件驱动.给控件添加事件也有接口回调和委托代理的方式.今天这篇博客就总结一下Android中常用的基本控件以及布局方式.说到布局方式Android和iOS还是区别挺大的,在iOS中有Frame绝对布局和AutoLayout相对布局.而在Android中的布局方式就比较丰富了,今天博客中会介绍四种常用的布局方式.先总结一下控件,然后再搞一搞基本方式,开发环境还是用的Mac下的Android Studio.开始今天的正题, 虽然A

递归详解(二)

1 public class A { 2 static int k=0; 3 public static void main(String args[]) { 4 char[] ss = { '1', '2', '3', '4', '5', '6', '7', '1', '2', '3', '4', 5 '5', '6', '7' }; 6 permutation(ss, 0); 7 } 8 public static void permutation(char[] ss, int i) { 9