汉诺塔递归函数少个参数怎么办?

汉诺塔问题,大一学数据结构的时候就接触了。

今天遇到一个作业,作业要求给定了递归函数的定义:

public class Tower
{
   private int ndisks;
   private ArrayList<TowerMove> result = new ArrayList<>();

   public Tower(int ndisks)
   {
      this.ndisks = ndisks;
   }

   public ArrayList<TowerMove> solveTower(String src, String aux, String dst){

      return result;
   }  

要实现这个方法,src表示from塔,aux表示辅助塔,dst表示目标塔,三个参数都很熟悉。可是还是少了一个参数哎,int disk参数没给啊?

网上很多算法包括自己学的数据结构书上的这个递归函数都是4个参数。数据结构书上大概思路是这样子的:

void hanoi(int n, String src, String aux, String dst){

    if(n == 1){
        move(1, src, dst);
    }
    else{
        hanoi(n-1, src, dst, aux); //将 编号为1~(n-1)的圆盘从src塔移到aux塔,dst辅助
        move(n, src, aux, dst); //将最下边的盘子移到dst
        hanoi(n-1, aux, src, dst); //将编号为1~(n-1)的圆盘从aux塔移到dst,src辅助
    }
}

明明就是四个参数!

思考了良久,如何解决那个参数的问题。由于类中有一个成员变量ndisks,于是自己有加了个变量,代码是这个样子的:

 public ArrayList<TowerMove> solveTower(String src, String aux, String dst){

      if(ndisks == 1){
         TowerMove move = new TowerMove(1, src, dst);
         result.add(move);
      }

      else{
         int temp = ndisks; //保存当前盘子数量到temp变量中

         //下面两行代码其实等价于
         //hanoi(n-1, src, dst, aux); 因为 ndisks--之后递归出口用ndisks==1做判断的
         ndisks--;
         solveTower(src, dst, aux); 

         //递归许久之后,该走这里了,temp还是本层调用的那个temp
         //等价于: move(n, src,dst);
         TowerMove move = new TowerMove(temp, src, dst);

         result.add(move); //保存移动记录

         //下面两行代码其实等价于
         //hanoi(n-1, aux, src, dst);
         ndisks = temp-1;
         solveTower(aux, src, dst);
      }

      return result;
   }  

这样的话,就不会出问题了。

总结:在递归函数中,参数传递和定义局部变量起的作用是一样的,都是保存本层函数调用的相关数据而已,不会影响其他调用层。而全局变量则会影响其他调用层,然后就乱套了。

时间: 2024-10-16 00:38:46

汉诺塔递归函数少个参数怎么办?的相关文章

汉诺塔递归函数hanoi

def hanoi(n,src,dst,mid): global count if n==1: print('{}:{}->{}'.format(1,src,dst)) count+=1 else: hanoi(n-1,src,mid,dst) print('{}:{}->{}'.format(n,src,dst)) count+=1 hanoi(n-1,mid,dst,src)count=0hanoi(3,'A','C','B')print(count) 原文地址:https://www.c

汉诺塔问题(Hanoi)的C++代码实现

1 #include <iostream> 2 using namespace std; 3 //第一个塔为初始塔,第二个塔为中转塔,第三个塔为目标塔 4 5 int i = 1; //记录步数 6 void move(int n,char from,char to) //将编号为N的盘子由from塔转移到to塔 7 { 8 cout<<"第"<<i++<<"步:将"<<n<<"号盘子

算法笔记_013:汉诺塔问题(Java递归法和非递归法)

目录 1 问题描述 2 解决方案  2.1 递归法 2.2 非递归法 1 问题描述 Simulate the movement of the Towers of Hanoi Puzzle; Bonus is possible for using animation. e.g. if n = 2 ; A→B ; A→C ; B→C; if n = 3; A→C ; A→B ; C→B ; A→C ; B→A ; B→C ; A→C; 翻译:模拟汉诺塔问题的移动规则:获得奖励的移动方法还是有可能的.

从&quot;汉诺塔&quot;经典递归到JS递归函数

前言 参考<JavaScript语言精粹> 递归是一种强大的编程技术,他把一个问题分解为一组相似的子问题,每一问题都用一个寻常解去解决.递归函数就是会直接或者间接调用自身的一种函数,一般来说,一个递归函数调用自身去解决它的子问题. "汉诺塔"经典递归问题 "汉诺塔"是印度的一个古老传说,也是程序设计中的经典的递归问题,是一个著名的益智游戏: 题目如下: 塔上有三根柱子和一套直径各不相同的空心圆盘,开始时源柱子上的所有圆盘都按从大到小的顺序排列.目标是通过

JavaScript递归函数解“汉诺塔”

"汉诺塔"是一个著名的益智游戏.塔上有3根柱子和一套直径各不相同的空心圆盘.开始时柱子上的所有圆盘都按照从小到大的顺序堆叠.目标是通过每次移动一个圆盘到另一根柱子,最终把一堆圆盘移动到目标柱子上,过程中不允许把交大的圆盘放置在较小的圆盘之上. 仔细解读这段话,如果有10个圆盘甚至更多,那操作步骤绝对多到让人震惊,但目标是把一堆圆盘移动到目标柱子上,如果把上面的9个圆盘看成一套,第10个圆盘看成另一套,先移动9个圆盘到另一根柱子上,再把上面8个圆盘看成一套,第9个圆盘看成另一套--依次类

递归函数 汉诺塔

#include<stdio.h>//递归函数,汉诺塔void hanoi(int n,char c1,char c2,char c3);void move(char x,char y);int main(){ int i; printf("move n dishes for A to C,n="); scanf("%d",&i); hanoi(i,'A','B','C'); return 0;}void hanoi(int n,char c1,

汉诺塔递归

#一日一词# 今天在学习Python的时候,遇到了递归问题,案例呢就是经典的汉诺塔游戏,表示虽然以前就接触过这游戏,解起来也很容易,不过放在编程里,几行的代码可够我手推了一个多小时.╭∩╮(︶︿︶)╭∩╮ 当然也是感受到了搞清楚一个(我认为的)难题的乐趣,心情大好,买条裤子. (表示从晚上一直整理到第二天,电脑没电所以今早发,生日与学习紧密结合)? 首先说下汉诺塔游戏,如下图,需要利用中间的柱子将左边的所有圆盘移动到最右边的柱子上,且和原来的大小上下顺序一致,移动过程中保证大盘永远在小盘下面.

脚本进击之汉诺塔tatatata……

操作环境依旧是centos7与centos6.阿拉的脚本都是放在7上了,6里的通用性大概有0.5%左右的误差,错误和可完善之处尽请指正. 请忽略中二的标题>_<. 嘛,某种意义上,这个标题还算贴切.因为这个问题咋一看到就是会给人一种头大的感觉,踏踏踏踏踏,塔塔塔塔塔塔-- 哦急死尅.先看过题目再来说头大的问题吧. 原题如下: 汉诺塔(又称河内塔)问题是源于印度一个古老传说.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着 64片黄金圆盘.大梵天命令婆罗门把圆盘从下面

从汉诺塔问题来看“递归”本质

汉诺塔问题 大二上数据结构课,老师在讲解"栈与递归的实现"时,引入了汉诺塔的问题,使用递归来解决n个盘在(x,y,z)轴上移动. 例如下面的动图(图片出自于汉诺塔算法详解之C++): 三个盘的情况: 四个盘的情况: 如果是5个.6个.7个....,该如何移动呢? 于是,老师给了一段经典的递归代码: void hanoi(int n,char x,char y,char z){ if(n == 1) move(x,1,z); else{ hanoi(n-1,x,z,y); move(x,