第四篇 AS的递归算法

package
{
import flash.display.Sprite;

public class recursion extends Sprite
{
public function recursion()
{
//trace(sum(5));简单的递归
doTowers(2,"A","B","C");//汉诺(hanoi)
}

private function doTowers(n:int, f:String, m:String, t:String):void
{
if(n==1){
//如果一个的话直接是放到目的地即可
   trace("第"+n+"个from "+f+" to "+t);
}else{
//每次的上一步都是先从第一个移到中间
doTowers(n-1,f,t,m);
//每次的第二步都是先从第一个移到最后
trace("第"+n+"个from "+f+" to "+t);
//每次的第三步都是先从第二个移到最后
doTowers(n-1,m,f,t);
}

}



private function sum(n:int):Number{
   if(n==1){
 return 1;
}else{
 return n*sum(n-1);
}
}

}

}


那个链表后面发,先发递归··大哭其实是链表还不知道怎么写····

### Hanoi塔递归算法实现过程解释 #### 1. 基本概念 Hanoi塔问题是经典的递归问题之一,其目标是从起始柱子(通常称为A)通过辅助柱子(B),将所有的圆盘按照相同的顺序移动到目标柱子(C)。每次只能移动一个圆盘,并且任何时候都不能将较大的圆盘放在较小的圆盘之上。 该问题的核心在于利用递归来分解复杂的问题为更小的子问题。具体来说,要将`n`个圆盘从一根柱子移到另一根柱子,可以分为三个主要部分: - 将前`n-1`个圆盘从起始柱子借助辅助柱子移动到中间柱子; - 将第`n`个圆盘直接从起始柱子移动到目标柱子; - 再次将前`n-1`个圆盘从中间柱子借助起始柱子移动到目标柱子[^1]。 #### 2. 时间复杂度分析 由于每一步都需要处理两个子问题以及一次额外的操作,因此整个算法的时间复杂度为 \( O(2^n) \)。这意味着当圆盘数较多时,计算量会迅速增大。 #### 3. C/C++中的代码实现 以下是基于上述逻辑的一个标准C/C++版本的Hanoi塔递归解决方案: ```cpp #include <stdio.h> // 函数用于模拟单步移动操作 void move(char fromPeg, char toPeg) { printf("%c -> %c\n", fromPeg, toPeg); } // 主递归函数定义 void hanoi(int n, char startPeg, char endPeg, char auxPeg) { if (n == 1) { // 当只剩下一个盘子时,直接完成移动 move(startPeg, endPeg); } else { // 步骤一:先将上面n-1个盘子从startPeg移动到auxPeg hanoi(n - 1, startPeg, auxPeg, endPeg); // 步骤二:再单独把最大的那个盘子从startPeg移动到endPeg move(startPeg, endPeg); // 步骤三:最后将之前留在auxPeg上的n-1个盘子移动到endPeg hanoi(n - 1, auxPeg, endPeg, startPeg); } } int main() { int numberOfDiscs; printf("Enter the number of discs: "); scanf("%d", &numberOfDiscs); // 调用hanoi函数解决问题 hanoi(numberOfDiscs, 'A', 'C', 'B'); return 0; } ``` 这段程序首先询问用户输入多少个圆盘,接着调用 `hanoi()` 来执行具体的递归运算并打印出每一个必要的动作序列[^2]。 #### 4. Java中的代码实现 同样地,在Java中也可以采用类似的思路来编写汉诺塔的递归解法如下所示: ```java public class HanoiTower { public static void moveDisk(char sourceRod, char destinationRod){ System.out.println(sourceRod+"->"+destinationRod); } public static void solveHanoiProblem(int numDisks,char startRod ,char targetRod ,char auxiliaryRod ){ if(numDisks==1){ moveDisk(startRod,targetRod ); }else{ // Move top N-1 disks from A to B using C as temporary storage. solveHanoiProblem(numDisks-1,startRod,auxiliaryRod,targetRod ); // Now perform single disk movement between rods. moveDisk(startRod,targetRod ); // Finally shift remaining N-1 Disks From B To Target Rod Using Source As Temporary Storage Again. solveHanoiProblem(numDisks-1,auxiliaryRod,targetRod,startRod ); } } public static void main(String[] args)throws Exception{ java.util.Scanner sc=new java.util.Scanner(System.in); System.out.print("Number Of Discs :"); int no=sc.nextInt(); solveHanoiProblem(no,'A','C','B'); } } ``` 此段JAVA代码实现了与前面提到过的C ++版本几乎完全一致的功能和行为模式[^4]. #### 总结说明 无论是哪种编程语言所书写的汉诺塔递归方案都遵循着同一个基本原理&mdash;&mdash;分治策略下的自我重复调用机制;同时需要注意的是尽管这种方法直观简洁易于理解掌握,但由于它本质上属于指数型增长范畴内的穷举类方法论所以并不适合应用于大规模数据场景下求解此类难题[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值