递归调用

排列组合问题

北慕城南 提交于 2019-12-23 05:49:04
转自博客:http://blog.csdn.net/star143133/article/details/6854745 代码见Problem28 问题1 : 输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串 abc ,则输出由字符 a 、 b 、 c 所能排列出来的所有字符串 abc 、 acb 、 bac 、 bca 、 cab 和 cba 。 思路:这是个递归求解的问题。递归算法有四个特性:(1)必须有可达到的终止条件,否则程序将陷入死循环;(2)子问题在规模上比原问题小;(3)子问题可通过再次递归调用求解;(4)子问题的解应能组合成整个问题的解。 对于字符串的排列问题。如果能生成n - 1个元素的全排列,就能生成n个元素的全排列。对于只有1个元素的集合,可以直接生成全排列。全排列的递归终止条件很明确,只有1个元素时。下面这个图很清楚的给出了递归的过程。 参考代码:解法1通过Permutation_Solution1(str, 0, n); 解法2通过调用Permutation_Solution2(str, str)来求解问题。 view plain copy to clipboard //函数功能 : 求一个字符串某个区间内字符的全排列 //函数参数 : pStr为字符串,begin和end表示区间 //返回值 : 无 void Permutation

字符串的排列组合问题

白昼怎懂夜的黑 提交于 2019-12-23 05:47:56
问题1 : 输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串 abc ,则输出由字符 a 、 b 、 c 所能排列出来的所有字符串 abc 、 acb 、 bac 、 bca 、 cab 和 cba 。 思路:这是个递归求解的问题。递归算法有四个特性:(1)必须有可达到的终止条件,否则程序将陷入死循环;(2)子问题在规模上比原问题小;(3)子问题可通过再次递归调用求解;(4)子问题的解应能组合成整个问题的解。 对于字符串的排列问题。如果能生成n - 1个元素的全排列,就能生成n个元素的全排列。对于只有1个元素的集合,可以直接生成全排列。全排列的递归终止条件很明确,只有1个元素时。下面这个图很清楚的给出了递归的过程。 参考代码:解法1通过Permutation_Solution1(str, 0, n); 解法2通过调用Permutation_Solution2(str, str)来求解问题。 view plain print ? //函数功能 : 求一个字符串某个区间内字符的全排列 //函数参数 : pStr为字符串,begin和end表示区间 //返回值 : 无 void Permutation_Solution1( char *pStr, int begin, int end) { if (begin == end - 1) //只剩一个元素 { for ( int

[面试] 全排列(非递归)

烂漫一生 提交于 2019-12-23 05:43:06
打印一个数组的全排列,要求非递归。 模拟递归当然会想到用栈模拟,最主要的是考虑初始的压入栈中的值,这里首先想到递归调用是用一个for循环遍历0到n-1的索引,看哪个可以用(比如k)就递归调用函数,然后返回的时候在k+1继续循环查找下去。这里的关键是如何能模拟循环的一个过程,于是我考虑到用出栈的值的下一个值来继续for循环的下一个值,于是初始从0开始,我们就可以先压入-1,然后再把它弹出栈,取下一个值作为for循环的初始值。然后当栈大小>n时打印。 1 #include <iostream> 2 #include <vector> 3 #include <stack> 4 using namespace std; 5 6 void permutation(int a[], int n) 7 { 8 vector<int> b(n); 9 vector<bool> canUse(n); 10 11 for(int i = 0; i < n; i++) 12 canUse[i] = true; 13 14 stack<int> s; 15 16 s.push(-1); 17 18 while(!s.empty()) 19 { 20 if (s.size() > n) 21 { 22 for(int i = 0; i < n; i++) 23 cout << b[i] << ' '; 24

python算法攻坚

不想你离开。 提交于 2019-12-23 04:06:23
文章目录 递归 什么是递归呢? 递归实现斐波拉契数列 递归 递归在我们编写算法中非常常见,很多算法都是通过递归来实现,递归虽然使用简单,但是想了解其内部流程没有那么简单的。 什么是递归呢? 递归重在搞明白内在的过程,不能之前然而不知其所以然 比如二叉树的深度优先遍历,斐波那契额数列,这些写起来很简单,但是像是回溯就比较难了,如果对递归的本质理解不透彻的话,就写不出正确的算法来 递归最常见的定义: 函数内部调用函数本身。那么这个函数就是递归函数,其本质还是一个循环 递归分为两个过程 :一个是‘递’,一个是‘归’,这些都是自动化完成的 递归一定要设置终止条件 :递归一定要终止,怎么写终止条件很重要 递归实现斐波拉契数列 斐波拉契数列又称黄金分割数列,也叫兔子数列 指的是这样的一个数量,1,2,3,5,8,13,21,34,…后边的数等于前边的数之和,我们要解决的是100个数是多少 #1.什么地方调用递归本身 #2.什么时候终止递归 #1 1 2 3 5 8 13 21 import time total = {} def fib_test(k): """ #求解第k个数的值 :param k: 求解第几个数 :return: """ assert k > 0, '\nk必须大于0' if k in [1,2]: #终止递归 return 1 global total if k not

面试官问你斐波那契数列的时候不要高兴得太早

£可爱£侵袭症+ 提交于 2019-12-23 02:11:17
原文地址:https://www.yanbinghu.com/2019/01/07/16863.html 前言 假如面试官让你编写求斐波那契数列的代码时,是不是心中暗喜?不就是递归么,早就会了。如果真这么想,那就危险了。 递归求斐波那契数列 递归,在数学与计算机科学中,是指在函数的定义中使用函数自身的方法。 斐波那契数列的计算表达式很简单: F(n) = n; n = 0,1F(n) = F(n-1) + F(n-2),n >= 2; 因此,我们能很快根据表达式写出递归版的代码: /*fibo.c*/#include <stdio.h>#include <stdlib.h>/*求斐波那契数列递归版*/unsigned long fibo(unsigned long int n){ if(n <= 1) return n; else return fibo(n-1) + fibo(n-2);}int main(int argc,char *argv[]){ if(1 >= argc) { printf("usage:./fibo num\n"); return -1; } unsigned long n = atoi(argv[1]); unsigned long fiboNum = fibo(n); printf("the %lu result is %lu\n",n

深入理解递归

淺唱寂寞╮ 提交于 2019-12-23 01:44:09
递归的思想 以此类推 是递归的基本思想。 具体来讲就是把规模大的问题转化为规模小的相似的子问题来解决。在函数实现时,因为解决大问题的方法和解决小问题的方法往往是同一个方法,所以就产生了函数调用它自身的情况。另外这个解决问题的函数必须有明显的结束条件,这样就不会产生无限递归的情况了。 递归的两个条件 可以通过递归调用来缩小问题规模,且新问题与原问题有着相同的形式。(自身调用) 存在一种简单情境,可以使递归在简单情境下退出。(递归出口) 递归算法的一般形式 : 1 2 3 4 5 6 7 func( mode){ if (endCondition){ //递归出口 end; } else { func(mode_small) //调用本身,递归 } } 求一个数的阶乘是练习简单而典型的例子,阶乘的递推公式为:factorial(n)=n*factorial(n-1),其中n为非负整数,且0!=1,1!=1 我们根据递推公式可以轻松的写出其递归函数: 1 2 3 4 5 6 7 8 public static long factorial( int n) throws Exception { if (n < 0 ) throw new Exception( "参数不能为负!" ); else if (n == 1 || n == 0 ) return 1 ; else return n

数据结构与算法之美之栈、队列和递归

穿精又带淫゛_ 提交于 2019-12-22 00:40:18
栈 栈既可以用数组来实现,也可以用链表来实现。用数组实现的栈,我们叫作顺序栈,用链表实现的栈,我们叫作链式栈 实现方法: package com.smao.leetcode; /** * 数组式链表 */ public class ArrayStack { private String[] arrayStack; private int size;//栈中元素个数 private int count;//栈的容量 public ArrayStack(int count) { this.arrayStack = new String[count]; this.count = count; this.size = 0; } public boolean push(String item){ if(this.count == this.size){ String[] arrayStackNew = new String[this.count*2]; for(int i=0;i<arrayStack.length;i++){ arrayStackNew[i] = arrayStack[i]; this.count = this.count*2; } this.arrayStack = arrayStackNew; } arrayStack[this.size] = item; this

汉诺塔的图解递归算法

折月煮酒 提交于 2019-12-21 20:54:10
原文链接:(转载请注明出处) https://dmego.me/2016/10/16/hanoi 一.起源:   汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。 二.抽象为数学问题:   如下图所示,从左到右有A、B、C三根柱子,其中A柱子上面有从小叠到大的n个圆盘,现要求将A柱子上的圆盘移到C柱子上去,期间只有一个原则:一次只能移到一个盘子且大盘子不能在小盘子上面,求移动的步骤和移动的次数 解:(1)n == 1       第1次 1号盘 A---->C sum = 1 次 (2) n == 2       第1次 1号盘 A---->B        第2次 2号盘 A---->C       第3次 1号盘 B---->C sum = 3 次   (3)n == 3         第1次 1号盘 A---->C         第2次 2号盘 A---->B         第3次 1号盘 C---->B         第4次 3号盘 A---->C         第5次 1号盘 B---->A         第6次 2号盘 B-

函数之递归

非 Y 不嫁゛ 提交于 2019-12-21 17:57:48
递归 前戏 在讲今天的内容之前,我们先来讲一个故事,讲的什么呢?从前有座山,山里有座庙,庙里有个老和尚讲故事,讲的什么呢?从前有座山,山里有座庙,庙里有个老和尚讲故事,讲的什么呢?从前有座山,山里有座庙,庙里有个老和尚讲故事,讲的什么呢?从前有座山,山里有座庙,庙里有个老和尚讲故事,讲的什么呢......这个故事你们不喊停我能讲一天!我们说,生活中的例子也能被写成程序,刚刚这个故事,让你们写,你们怎么写呀? while True: story = " 从前有个山,山里有座庙,庙里老和尚讲故事, 讲的什么呢? " print(story) 你肯定是要这么写的,但是,现在我们已经学了函数了,什么东西都要放到函数里去调用、执行。于是你肯定会说,我就这么写: def story(): s = """ 从前有个山,山里有座庙,庙里老和尚讲故事, 讲的什么呢? """ print(s) while True: story() 但是大家来看看,我是怎么写的! def story(): s = """ 从前有个山,山里有座庙,庙里老和尚讲故事, 讲的什么呢? """ print(s) story() story() 先不管函数最后的报错,除了报错之外,我们能看的出来,这一段代码和上面的代码执行效果是一样的。 递归的概念: 在一个函数内部调用这个函数自身我们就可以将其称为递归函数

递归函数

时间秒杀一切 提交于 2019-12-21 15:19:51
递归函数 """ 递归函数:基线条件和递归条件 递归条件:函数调用自己。 基线条件:是函数结束循环,避免无限循环 """ # 倒计时 def countdown ( i ) : print ( i ) if i <= 1 : return else : countdown ( i - 1 ) countdown ( 3 ) # 栈 def greet ( name ) : print ( 'hello, ' + name + '!' ) greet2 ( name ) print ( 'getting ready to say bye...' ) def greet2 ( name ) : print ( 'how are you, ' + '?' ) def bye ( ) : print ( 'ok bye !' ) greet ( 'maggie' ) # 递归调用栈 def fact ( x ) : if x == 1 : return 1 else : return x * fact ( x - 1 ) print ( fact ( 3 ) ) 3 2 1 hello , maggie! how are you , ? getting ready to say bye . . . 6 来源: CSDN 作者: 陨星落云 链接: https://blog.csdn.net