7.22 递归的例子:楼梯算法

n层阶梯的楼梯,每次可以走1~2层阶梯,打印列举所有走法。

// 比如

// 走1层的可能走法 (1种)

// 1

// 走2层的可能走法(2种)

// 1 1

// 2

// 走3层的可能走法(3种)

// 1 1 1

// 1 2

// 2 1

// 走4层的可能走法(5种)

// 1 1 1 1

// 1 1 2

// 2 2

// 2 1 1

// 1 2 1

// 走n层的走法

private static void step(int n, int[] a)

{

int sum = 0;

for (int i = 0; i < a.length; i++)

{

sum += a[i];

}

if (sum <= n - 2)

{

for (int i = 1; i <= 2; i++)

{

int x = 0;

for (int j = 0; j < a.length; j++)

{

if (a[j] == 0)

{

x = j;

break;

}

}

a[x] = i;

step(n, a);

}

}

else if (sum == n - 1)

{

int x = 0;

for (int j = 0; j < a.length; j++)

{

if (a[j] == 0)

{

x = j;

break;

}

}

a[x] = 1;

step(n, a);

}

else

{

for (int i = 0; i < a.length; i++)

{

if (a[i] != 0)

{

System.out.print(a[i] + " ");

}

}

System.out.println();

}

int x = 0;// 每次step方法执行到最后的时候,要擦除这次往a数组中赋的值!

for (int j = a.length - 1; j >= 0; j--)

{

if (a[j] != 0)

{

x = j;

break;

}

}

a[x] = 0;

// 局部变量是数组,step方法根据数组的各位数总和判断是否再继续调用,当执行到最后,局部变量数组

// 又变成结果输出,step方法顺利执行完,此时将执行上一层的step方法,该结果有要作为局部变量使用

// 如果不改结果,程序逻辑将会出错!那么想到要在输出结果后把变量的上一次赋值擦除,那么程序能继续

// 正确运行,然而当上一层的step方法执行完后,又要返回更上一层,此时没有执行到输出结果的那个分支,

// 那么变量又会出错,所以经分析,应该在每一个step方法的结束处更改变量。测试成功!

}

时间: 2024-11-10 07:52:44

7.22 递归的例子:楼梯算法的相关文章

初学LUA—实现上楼梯算法

题目:楼梯有n阶台阶,上楼可以一步上1阶,也可以一步上2阶,编一程序列出每一种走法. 要求是使用递归和迭代两种不同的方法来实现.对于我这个算法又渣也没接触过LUA的人来说,真是有点脑子不够用了!! ' 捣鼓了一整天,了解LUA语法,各种google百度,暂且只能弄出递归解法,至于迭代,还得好好理解理解! --递归 function walkStairs(remainingSteps,currentSteps) if remainingSteps<=2 then printWalkWays(rem

这是递归和回溯的算法 是abcd&#39;的排列可能

#include<stdio.h>#include<iomanip>#include<iostream>using namespace std;bool b[10]={0};int a[10]={0};int print(){ for (int i=1;i<=4;i++) printf("%c ",a[i]); printf("\n");} int dosomething(int z){ int mm; for ( mm=1

递归之回朔算法应用----八皇后问题

从前,有个皇帝,取了八个皇后,由此产生一系列乱七八糟的问题,八皇后问题由此产生.哈哈 开个玩笑~~~~ 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法. 高斯认为有76种方案.1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果.计算机发明后,有多种方法可以解决此问题.

一列数字的规则如下;1,1,2,3,5,8,13,21,34........ 求第30位数字是多少,用递规和非递归两种方法算法实现

斐波纳契数列(Fibonacci Sequence),又称黄金分割数列.在数学上,斐波纳契数列以如下被以递归的方法定义:F0=0,F1=1,Fn=F(n-1)+F(n-2)(n>=2,n∈N*)在现代物理.准晶体结构.化学等领域,斐波纳契数列都有直接的应用,现在我从算法的角度,利用递归和非递归两种方式来进行实现: 一:递归 这个数列是用递归来实现的经典例子. private static  long Fibonacci(int n)         {             long resu

预排序遍历树算法(非递归无限极分类算法)

多层数据结构估计所有的web开发者估计都不会陌生,各种软件的分类都是基于多层结构来设计的. 下面是一个典型的多层数据结构示意图: 相关创建数据语句:CREATE TABLE category(category_id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(20) NOT NULL,parent INT DEFAULT NULL); INSERT INTO categoryVALUES(1,'ELECTRONICS',NULL),(2,'TELEVI

Python——递归、二分查找算法

递归函数 1. 递归 (1)什么是递归:在函数中调用自身函数(2)最大递归深度:默认997/998--是Python从内存角度出发做的限制 n = 0 def story(): global n n+= 1 print(n) story() #997/998 story() (3)修改最大深度:最好不要改--递归次数太多,则不适合用递归解决问题 import sys sys.setrecursionlimit(2000) #1997/1998 2. 递归的优点 会让代码变简单 3. 递归的缺点

C语言:递归小例子几则

递归定义: 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法. 递归条件: (1) 递归就是在过程或函数里调用自身: (2) 在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口. 利用递归可以使程序简化,减少代码的编写,下面请看例子. 1.取得十进制数的每一位并以字符的形式输出. #include<stdio.h> #include<stdlib.h> void binary_to_ascii(unsigned int value) { int num = v

非递归快速求幂算法

快速求正整数次幂,当然不能直接死乘.举个例子:3 ^ 999 = 3 * 3 * 3 * … * 3直接乘要做998次乘法.但事实上可以这样做,先求出2^k次幂:3 ^ 2 = 3 * 33 ^ 4 = (3 ^ 2) * (3 ^ 2)3 ^ 8 = (3 ^ 4) * (3 ^ 4)3 ^ 16 = (3 ^ 8) * (3 ^ 8)3 ^ 32 = (3 ^ 16) * (3 ^ 16)3 ^ 64 = (3 ^ 32) * (3 ^ 32)3 ^ 128 = (3 ^ 64) * (3

一个强悍的极简单递归小例子帮你从程序执行的角度理解递归

1 public class test { 2 public static void main(String[] args) { 3 swap(3); 4 } 5 public static int i=1; //全局变量 6 public static void swap(int a){ //局部变量 7 if(a>0){ 8 a--; 9 System.out.println("第"+i+"层:"); 10 System.out.println("