递归-汉诺塔

article/2025/9/17 23:47:44

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

递归(recursion):程序调用自身的编程技巧。

  1. 反复执行的过程(调用自身)
  2. 有跳出反复执行过程的条件(递归出口)
import com.lifeibigdata.algorithms.leetcode.TreeNode;
public class Recursive {public static void main(String[] args) {
//        System.out.println(factorial(3));
//        tower(2,'A','B','C');
//        perm(new int[]{1,2,3},0,2);
//        System.out.println(fib(2));
//        System.out.println(fib_i(1,1,7));System.out.println(factorial_tail(3,1,1));
//        System.out.println(is_palindereme(""));
//        System.out.println(binary_search(new int[]{1,2,3,4,5},4));
//        System.out.println(binSearch(new int[]{1,2,3,4,5},0,4,6));}/*** 阶乘* n! = n * (n-1) * (n-2) * ...* 1(n>0)**/static int factorial(int x){if (0 == x){return 1;} else {return x*factorial(x - 1);}}// 迭代计算过程static int factorial2(int n){return factIterator(1, 1, n);}static int factIterator(int result, int counter, int maxCount){if(counter > maxCount){return result;}return factIterator((counter * result), counter + 1, maxCount);}/*** 汉诺塔问题**当n=1时,将A上的盘子直接移动到C上*当n>=2时:*1,将A上n-1个盘子移动到B上(此步骤的解决办法与移动n阶盘子的方法完全一样,只是问题的规模减小1阶)*2,将A上的一个盘子移动到C*3,将B上的n-1个盘子移动到C上。**/public static void tower(int n,char one,char two,char three){if(n==1){move(one,three,1);}else{tower(n-1,one,three,two);   //把第1个移动到第2个move(one,three, n);         //将第n个盘,从第1个移动到第3个柱子tower(n-1,two,one,three);   //把第2个移动到第3个}System.out.println("---");/***A的第1盘移动到CA的第2盘移动到BC的第1盘移动到BA的第3盘移动到CB的第1盘移动到AB的第2盘移动到CA的第1盘移动到C*/}//输出public static void move(char x,char y, int n){System.out.println(x+"的第"+n+"盘移动到"+y);}/*** 全排列问题* http://blog.csdn.net/xiazdong/article/details/7986015*/static void swap(int a,int b,int arr[]){int temp=arr[a];arr[a]=arr[b];arr[b]=temp;}public static void perm(int arr[], int begin,int end) {if(end==begin){         //一到递归的出口就输出数组,此数组为全排列for(int i=0;i<=end;i++){System.out.print(arr[i]+" ");}System.out.println();return;}else{for(int j=begin;j<=end;j++){swap(begin,j,arr);      //for循环将begin~end中的每个数放到begin位置中去perm(arr,begin+1,end);  //假设begin位置确定,那么对begin+1~end中的数继续递归swap(begin,j,arr);      //换过去后再还原}}}/*** 斐波纳契数列,又称黄金分割数列** 这个数列从第三项开始,每一项都等于前两项之和* 斐波那契数列这样定义:f(0) = 0, f(1) = 1, 对n > 1, f(n) = f(n-1) + f(n-2)* 1、1、2、3、5、8、13*/static long fib(int n) {if (n == 0)return 1;if (n == 1)return 1;if (n > 1)return fib(n-1) + fib(n-2);return 0;}static int fib_i(int a, int b , int n){if(n == 2)return a+b;elsereturn fib_i(b, a+b, n-1);}static int factorial_tail(int n,int acc1,int acc2){if (n < 2){return acc1;}else{return factorial_tail(n-1,acc2,acc1+acc2);}}/***fibonacci(n-1,acc2,acc1+acc2)真是神来之笔,原本朴素的递归产生的栈的层次像二叉树一样,以指数级增长,但是现在栈的层次却像是数组,变成线性增长了,实在是奇妙,总结起来也很简单,原本栈是先扩展开,然后边收拢边计算结果,现在却变成在调用自身的同时通过参数来计算。小结尾递归的本质是:将单次计算的结果缓存起来,传递给下次调用,相当于自动累积。在Java等命令式语言中,尾递归使用非常少见,因为我们可以直接用循环解决。而在函数式语言中,尾递归却是一种神器,要实现循环就靠它了。*/
//    def Fib(n,b1=1,b2=1,c=3):
//
//            if n <= 2:
//            return 1
//
//            else:
//            if n==c:
//            return b1+b2
//
//    else:
//            return Fib(n,b1=b2,b2=b1+b2,c=c+1)/****返回一个二叉树的深度*/int depth(TreeNode t){if(t == null) return 0;else {int a=depth(t.right);int b=depth(t.left);return (a>b)?(a+1):(b+1);}}/****判断一个二叉树是否平衡*/int isB(TreeNode t){if(t == null) return 0;int left=isB(t.left);int right=isB(t.right);if( left >=0 && right >=0 && left - right <= 1 || left -right >=-1)return (left<right)? (right +1) : (left + 1);else return -1;}/*** 求数组中的最大值*** 用递归算法求数组中的最大值* @param a 数组* @param low 数组下标* @param heigh 数组上标* @return*/public static int Max(int[] a, int low, int heigh) {int max;if(low > heigh-2) {if(a[low] > a[heigh]) max = a[low];else max = a[heigh];}else {int mid = (low + heigh)/2;int max1 = Max(a, low, mid);int max2 = Max(a, mid+1, heigh);max = max1>max2 ? max1 : max2;}return max;}/*** 数字塔问题*** 用递归算法求解数字塔问题* @param n 数字塔的行数* @return 数字塔的字符串*/public static String tourData(int n) {String str = new String();if(1 == n) {str = rowData(n) + "\n";return str;}else {str = tourData(n-1) + rowData(n) + "\n";}return str;}private static String rowData(int n) {String str = new String();for(int i=0; i<n; i++) {str = str+ n + "      ";}return str;}/*** 判断是否是回文* @param str* @return*/static boolean is_palindereme(String str){if (str.isEmpty() || str.length() < 2){return true;} else {
//            char[] chars = str.toCharArray();
//            if (chars[0] == chars[chars.length -1]){if (str.charAt(0) == str.charAt(str.length() - 1)){return is_palindereme(str.substring(1,str.length()-1));}}return false;}/*** 已排序数组的二分查找算法*/static boolean binary_search(int[] arr,int target){int mid = arr.length /2;if (arr[mid] == target){return true;} else if (arr[mid] > target){int[] narr = new int[arr.length - mid];System.arraycopy(arr,0,narr,0,arr.length - mid);return binary_search(narr,target);} else if (arr[mid] < target){int[] narr = new int[arr.length - mid];System.arraycopy(arr,mid,narr,0,arr.length - mid);return binary_search(narr,target);}return false;}/*** 递归方法实现二分查找法.* @param low 数组第一位置* @param high 最高* @param key 要查找的值.* @return 返回值.*/static int binSearch(int[] Array,int low,int high,int key){if (low<=high){int mid = (low+high)/2;if(key == Array[mid])return mid;else if(key<Array[mid])//移动low和highreturn binSearch(Array,low,mid-1,key);else if(key>Array[mid])return binSearch(Array,mid+1,high,key);}return -1;}
//    static boolean binary_search(int[] arr,int arrlength,int target){
//        int mid;
//        if (arrlength == 1) {
//            return arr[0] == target;
//        } else {
//            mid = arrlength/2;
//            if (arr[mid-1] == target){
//                return true;
//            } else if (arr[mid - 1] > target){
//                return binary_search(arr,mid,target);
//            } else {
//                return binary_search(arr,arrlength - mid,target);
//            }
//        }
//    }/*** 兔子产子问题*//*** 走楼梯问题*//*** 在二元树中找出和为某一值的所有路径* http://z466459262.iteye.com/blog/1115316**/
/*** 纯递归问题的难易主要纠结于一些条件表达式的构造以及初值的设置(上面的为直接表达式值的设定)* 递归分两步,递和归** 递归算法的一般形式:void   func(mode){if(endCondition){constExpression       //基本项}else{accumrateExpreesion /归纳项mode=expression //步进表达式func(mode) / /调用本身,递归}}*/
}

转载于:https://my.oschina.net/datacube/blog/706577


http://chatgpt.dhexx.cn/article/VlRUv0lh.shtml

相关文章

汉诺塔问题

2019独角兽企业重金招聘Python工程师标准>>> 前提说明&#xff1a; ‍算法&#xff1a;当只有一个盘子的时候&#xff0c;只需要从将A塔上的一个盘子移到C塔上。 当A塔上有两个盘子是&#xff0c;先将A塔上的1号盘子&#xff08;编号从上到下&#xff09;移动到B塔上…

JavaScript算法实现之汉诺塔(Hanoi)

目前前端新手&#xff0c;看到的不喜勿喷&#xff0c;还望大神指教。 随着Node.js&#xff0c;Angular.js,JQuery的流行&#xff0c;点燃了我学习JavaScript的热情&#xff01;以后打算每天早上跟晚上抽2小时左右时间将经典的算法都用JS来实现&#xff0c;加快学习JS的步伐&…

【C语言】递归的经典问题(模拟strlen,阶乘,斐波那契数列,汉诺塔,青蛙跳台阶)

以下我分享的是关于C语言递归的比较经典的题&#xff0c;有些题提供了多种解法&#xff0c;希望可以帮助你打开思路&#xff0c;如果你有更多的解法&#xff0c;欢迎评论区留言哟~ 目录 一、输入1234&#xff0c;输出1 2 3 4 二、模拟strlen功能 1&#xff09;递归 2&…

7.递归-汉诺塔

汉诺塔问题&#xff1a; 如果求解的汉诺塔是3层&#xff0c;可以先将上面的两层看作是一个整体。先将两层经过c作为中介移动到b&#xff0c;再将第三个圆盘直接移动到c。然后再将b上面的两个圆盘移动到c&#xff0c;通过a为中介。 算法分析&#xff08;递归算法&#xff09; 我…

数据结构与算法之汉诺塔问题

2019独角兽企业重金招聘Python工程师标准>>> 一、汉诺塔问题 1.汉诺塔问题 起源&#xff1a;一位法国数学家曾编写过一个印度的古老传说&#xff1a;在世界中心贝拿勒斯的圣庙里&#xff0c;一块黄铜板上插着三根宝石针。印度教的主神梵天在创造世界的时候&#xff…

汉诺塔 最优算法设计商量

2019独角兽企业重金招聘Python工程师标准>>> 引言 汉诺塔算法一向是算法设计科目标最具代表性的研究题目&#xff0c;本文存眷于如何设计多柱汉诺塔最优算法的商量。最简单的汉诺塔是三个柱子&#xff08;A、B、C&#xff09;&#xff0c;是以多柱汉诺塔的柱子个数M…

函数递归与汉诺塔

C初阶之函数递归 函数递归基本原理 什么是递归&#xff1f;程序调用自身的编程技巧称为递归recursion。一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法&#xff0c;它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解&#xff0c;…

分治算法的解和幂乘算法及其优化以及汉诺塔算法的介绍

分治算法就是分成若干个和原问题一样性质的子问题&#xff0c;然后逐步递归这些子问题&#xff0c;直到遇到规模很小的子问题&#xff0c;求出子问题的解&#xff0c;归结成原问题的解的算法就是分治算法 分治算法为递归问题&#xff0c;可以用来解决快排、二分归并、斐波那契数…

递归求解汉诺塔问题(详细解答)

汉诺塔移动步数的计算 具体汉诺塔的规则大家自行百度吧&#xff0c;就不介绍了&#xff0c;这里介绍一下如何求解汉诺塔移动步数的计算思想。 当汉诺塔层数为一层时&#xff0c;很显然只需要一步&#xff0c;直接从A杆移动到C杆 当层数为两层时&#xff0c;则需要三步&#x…

汉诺塔算法

2019独角兽企业重金招聘Python工程师标准>>> 有A、B和C 3跟柱子&#xff0c;在A上从下往上按照从小到大的顺序放着64个圆盘&#xff0c;以B为中介&#xff0c;把盘子全部移动到C上。移动过程中&#xff0c;要求任意盘子的下面要么没有盘子&#xff0c;要么只能有比它…

汉诺塔算法的理解

2019独角兽企业重金招聘Python工程师标准>>> 当盘子数为两个时&#xff0c;移动图如下&#xff1a; 移动规律为&#xff1a; 步骤盘子编号源柱子目标柱子11AB22AC31BC 当盘子数为3个时&#xff1a; 移动规律为&#xff1a; 步骤盘子编号源柱子目标柱子11AC22AB31CB4…

汉诺塔递归算法

2019独角兽企业重金招聘Python工程师标准>>> import java.util.Scanner;/*** 汉诺塔* * author JayChang* */ public class HanoiResolve {/*** 移动位置* * param positionA* param positionB*/public static void move(String positionA, String positionB) {Syst…

数据结构——树和二叉树 6-1 求二叉树高度 (20 分)

本题要求给定二叉树的高度。 函数接口定义&#xff1a; int GetHeight( BinTree BT ); 其中BinTree结构定义如下&#xff1a; typedef struct TNode *Position; typedef Position BinTree; struct TNode{ElementType Data;BinTree Left;BinTree Right; }; 要求函数返回给定…

PTA 函数题 求二叉树高度(C语言)

本题要求给定二叉树的高度。 函数接口定义&#xff1a; int GetHeight( BinTree BT ); 其中BinTree结构定义如下&#xff1a; typedef struct TNode *Position; typedef Position BinTree; struct TNode{ElementType Data;BinTree Left;BinTree Right; }; 要求函数返回给定…

6-1 求二叉树高度

6-1 求二叉树高度 (15 分) 本题要求给定二叉树的高度。 函数接口定义&#xff1a; int GetHeight( BinTree BT );其中BinTree结构定义如下&#xff1a; typedef struct TNode *Position; typedef Position BinTree; struct TNode{ElementType Data;BinTree Left;BinTree Rig…

二叉树的构造及求解二叉树高度

题目描述 1、参考题目解释构造一棵二叉树&#xff1b; 2、求解二叉树的高度 3、有余力同学尝试打印这棵二叉树&#xff08;以树的形态&#xff0c;非必须&#xff09; 输入 A(B(E,C(D(F(,G),),) 输出 二叉树高度为: 6 代码实现 #include <iostream> //#include &l…

二叉树4:二叉树求树高度(超级详细)

一、思路 什么是树高&#xff1f; 树的高度(或深度)就是树中结点的最大层数。 在这里使用后序遍历的递归算法。 对每一个结点都进行如下操作&#xff1a; 后序遍历其左子树求树高后序遍历其右子树求树高对这个结点进行下面操作&#xff1a; 比较其左右子树的高度大小若左&g…

二叉树的高度和深度

二叉树的高度和深度定义 &#xff08;对某个节点来说&#xff09; 深度是指从根节点到该节点的最长简单路径边的条数&#xff1b; 高度是指从最下面的叶子节点到该节点的最长简单路径边的条数&#xff1b; &#xff08;对二叉树&#xff09; 深度是从根节点数到它的叶节点&…

关于360提示发现木马—HEUR/QVM.Malware.Gen

今天用Visual Studio写的关于三层架构的程序 在启动运行时&#xff0c;弹出了360关于"检测到木马程序"的提示框&#xff1a; 虽然知道自己写的是正规程序&#xff0c;但初看时还是被吓了一跳&#xff0c;于是立马上网查阅相关资料和解答&#xff0c;结论是&#xff…

WebRTC 之 RTX

AbstractWebRTC RTX 笔记AuthorsWalter FanCategorylearning noteStatusv1.0Updated2020-08-28LicenseCC-BY-NC-ND 4.0 什么是 RTX RTX 就是重传 Retransmission, 将丢失的包重新由发送方传给接收方。 Webrtc 默认开启 RTX (重传)&#xff0c;它一般采用不同的 SSRC 进行传输&a…