递归函数

课堂作业02程序设计作业

瘦欲@ 提交于 2020-02-26 08:37:51
课后作业1: 1.设计思想: (1)适用组合数公式:先用递归方法,求出阶乘,然后求出组合数的大小。 (2)使用递推的方法:递推是由前往后退,通过杨辉三角找出规律,利用二元数组求出组合数的大小。 (3)使用递归的方法:由前往后调用递归公式,利用组合数公式,初始化值,求出组合数的大小。 2.程序流程图: 3.源程序代码: (1)使用组合数公式的代码: package zuheshu; import java.util.Scanner; import java.lang.Math.*; import java.math.BigInteger; public class Zuheshu { //组合数公式 public static BigInteger jiecheng(int n) { if(n<0) { System.out.println("输入有误"); } if(n==1||n==0) { return BigInteger.valueOf(1); } else { return BigInteger.valueOf(n).multiply(jiecheng((n-1))); } } public static long calculateN(int n){ if(n==1||n==0){ return 1; } return n*calculateN(n-1); }

关于递归方面的思想总结以及习题展示

こ雲淡風輕ζ 提交于 2020-02-25 20:01:07
汉诺塔游戏 * **【题目】** * 三个柱子,其中一个柱子全是由小到大的盘子 * 需要把这些盘子全部移动到另一个上并且顺序不变 * 要求:一次移动一个并且大的只可以在小的下面 *** 【算法思想】**: * 1,每次可以把第1~N-1个移到辅助柱子,第N个移动到目标柱子 * 2,然后将原始柱子作为辅助柱子,辅助柱子作为原始柱子 * 3,在进行第一步 *** 【总结】** * 学习递归要整体化思想把拆分后的一部分看作一个整体来处理 * 看到这个代码一直不明白,总是想把他代码套进去看一看 * 假如有4层的汉诺塔,把前3层作为整体就感觉一切都是那么顺其自然了 * 不必要担心前3层的操作,因为前3层在函数里面还会被分为第3层和前2层 * 所以说只需要将事物整体化,才可以看明白递归,才可以遇到问题想出递归代码 public class 汉诺塔游戏 { public static void main ( String [ ] args ) { String A = "A" , B = "B" , C = "C" ; printHanoiTower ( 4 , A , C , B ) ; } public static void printHanoiTower ( int N , String from , String to , String help ) { if ( N == 1 ) {

【LeetCode】437. 路径总和 III

怎甘沉沦 提交于 2020-02-22 18:10:21
解题思路 两次递归,可以发现,对以root为根的树进行查找路径数量和对以root的左右子树查找路径的思路一样,因此可以采用递归,在统计路径数量函数上,采用的DFS 代码 class Solution { public : int pathSum ( TreeNode * root , int sum ) { int count = 0 ; //统计出现的数量 FindPath ( root , sum , count ) ; //由于FindPath对root==nullptr进行了判断,因此此处无需写特判代码 return count ; } //对以root为根的树及其左右子树都进行统计 void FindPath ( TreeNode * root , int sum , int & count ) //sum:目标值 //count: 出现的数量(类型为引用) { if ( root == nullptr ) return ; //从以root为根的树统计该路径的数量 CountPath ( root , 0 , sum , count ) ; //左右子树分别寻找 FindPath ( root - > left , sum , count ) ; FindPath ( root - > right , sum , count ) ; } /

57.基础语法-递归函数

▼魔方 西西 提交于 2020-02-22 16:07:33
递归 函数直接或者间接的调用自己 阶乘 def fun0(n): print(n) if n == 1: return 1 else: return n * fun0(n-1) print(fun0(5)) 非彼拉切数列 def fun1(n): if n == 1 or n == 2: return 1 else: return fun1(n-2) + fun1(n-1) x_fun1 = 5 print("斐波拉且数列的第 {h} 个数是 {w}".format(h = x_fun1, w = fun1(x_fun1))) print("斐波拉且数列的第 %d 个数是 %d" % (x_fun1, fun1(x_fun1))) 汉诺塔 def hnt(a, b, c, n): if n == 1: print("{} --> {}".format(a, c)) elif n == 2: print("{} --> {}".format(a, b)) print("{} --> {}".format(a, c)) print("{} --> {}".format(b, c)) else: hnt(a, c, b, n-1) print("{} --> {}".format(a, c)) hnt(b, a, c, n-1) hnt_a = "A" hnt_b = "B" hnt_c

PHP无限级分类的递归算法

蓝咒 提交于 2020-02-20 19:23:21
至少需要3个字段 第一个是主键(ID),第二个是父级分类ID(parentid),第三个是分类的名称(classname)。可能的一种效果是: ID PARENTID CLASSNAME 1 0 一级分类A 2 0 一级分类B 3 1 二级分类A 4 1 二级分类B 主要思路:首先看第三行和第四行,父类ID(PARENTID)的值是1,表示属于id=1这个类的子类,而,一,二两行因为是一级分类,没有上级分类,所以父类ID(PARENTID)的值是0,表示初级分类,依次类推便实现了无限级分类。最终的效果是: ├一级分类A ├─┴二级分类A ├─┴二级分类B ├一级分类B 然后就是程序,这里以PHP作为描述语言,可以很方便的改成其他语言,因为原理相似,就是一个递归而已。 <?php $dbhost = "localhost"; // 数据库主机名 $dbuser = "root"; // 数据库用户名 $dbpd = "123456"; // 数据库密码 $dbname = "test"; // 数据库名 mysql_connect($dbhost,$dbuser,$dbpd); //连接主机 mysql_select_db($dbname); //选择数据库 mysql_query("SET NAMES 'utf8'"); display_tree("├",0); function

递归和列队

对着背影说爱祢 提交于 2020-02-20 05:53:22
一. 递归函数 # 递归调用:一个函数,调用了自身 称为递归调用 # 递归函数: 一个会调用自身的函数称为递归函数 # 凡是循环能干的事情 递归都能干 # 方式: # 写出临界条件 # 我这一次和上一次的关系 # 假设当前函数已经能用 调用自身计算上一次结果 在求出本次的结果 # 输入一个数(大于等于1) 求 1+2+3.......的和 def sum1(n): sum=0 for x in range(1,n+1): sum+=x return sum res=sum1(5) print(res) def sum2(n): if n==1: return 1 else: return n+sum2(n-1) res=sum2(3) print(res) #3 # 5+sum2(4) # 5+4+sum2(3) # 5+4+3+sum2(2) # 5+4+3++2sum2(1) # 5+4+3+2+1 # 模拟栈数据结构 # 压栈向栈里导入数据 a1=[] a1.append("A") print(a1) #['A'] a1.append("B") print(a1) #['A', 'B'] a1.append("C") print(a1) #['A', 'B', 'C'] # 出栈 b1=a1.pop() print(b1) # C print(a1) # ['A', 'B']

php递归函数--遍历

倖福魔咒の 提交于 2020-02-17 23:31:16
多应用在 栏目多级、无限极调用 数据库数据如: id catname pid 1 关于我们 0 2 新闻 0 3 公司新闻 2 4 行业动态 2 select读出数据后整理函数 $cate function digui($cate,$pid=0){   foreach($cate as $v){     if($v['pid']==$pid){       $v['child'] = digui($cate,$v['id']);       $arr[] = $v;     }   } return $arr; } 相当于不断在循环整个$cate数组。。 遍历html代码 1 <foreach name="cate" item='app'> 2 <div class="app"> 3 <p> 4 <strong>{$app.catname}</strong> 8 </p> 9 <foreach name="app.child" item='action'> 10 <dl> 11 <dt> 12 <strong>{$action.catnaem}</strong> 16 </dt>24         </dl> 25           </foreach> 26         </div> 27       </foreach> 来源: https://www.cnblogs

马踏棋盘之递归实现

核能气质少年 提交于 2020-02-17 07:58:52
问题描述: 所谓“马踏棋盘”问题,就是指在中国象棋的棋盘上,用马的走法走遍整个棋盘,在8*8的方格中,每个格都要遍历,且只能遍历一次。 我们把棋盘抽象成一个二维数据,输入起始位置的坐标(x,y),根据马的“日”字走法,将马走的步数写入二维数组,然后输出。下面是一种走法: 解决方法: 我们从图中可以看到,一个位置的马可以有八个不同方向的下一步。如何表示下一步呢? 设当前马的坐标为(x,y),则下一步为(x-2,y+1)、(x-1,y+2)、(x+1,y+2)、(x+2,y+1)、(x+2,y-1)、(x+1,y-2)、(x-1,y-2)、(x-2,y-1)八个方向。 我们设两个全局数组fx[8]={1,2,2,1,-1,-2,-2,-1},fy[8]={2,1,-1,-2,-2,-1,1,2},则上面的八个方向的点 可以表示为: (x+fx[i],y+fy[i]),i为0~7。 我们先设一个数组a[8][8]来存放马的遍历路径。 首先输入一个起始坐标,然后从起始点开始进行深度优先搜索。从第1步找第2步的坐标,然后从第2步找第3步,再从第3步找第4步……。直到找到第64步也就完成任务了。 当然,每一个马都有八个下一步的选择,我们在满足要求的点中任意找一个进行遍历,当八个点都不满足要求时,就回溯的上一步,找其他点进行遍历。 下一步需要满足的条件:点(x,y)要在棋盘上,即0<x,y<8

从《汉诺塔》来讲递归算法

元气小坏坏 提交于 2020-02-12 23:01:35
哈喽,大家好,我是Tony: 这篇博客将以《汉诺塔》为例进行递归编程: 编程题 给定一个整数n,代表汉诺塔游戏中从小到大放置的n个圆盘,假设开始时所有的圆盘都放到左边的桌子上,想按照汉诺塔游戏规则把所有的圆盘都移到右边的柱子上。实现函数打印最优移动轨迹 举例 n=1时,打印: move from left to right n=2时,打印: move from left to mid move from left to right move from mid to right 说明 这是一个典型的汉若塔问题,汉若塔问题永远都是经典的三步走: 把n-1的盘子移动到缓冲区 把1号从起点移到终点 把缓冲区的n-1号盘子移动到终点 代码(C++): // ConsoleApplication2.cpp : 定义控制台应用程序的入口点。 //汉诺塔问题 #include "stdafx.h" #include<iostream> #include<vector> #include<string> using namespace std; void funoi2(int n, string from, string buffer, string to) { if (n==1) { cout <<"Move "<<"from "<<from<<" "<< "to "<<to<<endl; }

递归基础

倾然丶 夕夏残阳落幕 提交于 2020-02-10 04:52:38
多个整数的逆序输出(函数专题) 时间限制: 1 Sec 内存限制: 128 MB 提交: 233 解决: 169 [ 提交 ][ 状态 ][ 讨论版 ] 题目描述 输入n和n个整数,以与输入顺序相反的顺序输出这n个整数。要求不使用数组,而使用递归函数实现。 输入 输入有两行,第一行是一个正整数n,第二行有n个整数,整数之间由空格隔开。 输出 输出n个整数,顺序与输入顺序相反,每个整数后有一个空格。 样例输入 5 11 22 33 44 55 样例输出 55 44 33 22 11 程序样例 #include<stdio.h> void Nixu(int n); int main() { int n; scanf("%d", &n); Nixu(n); return 0; } void Nixu(int n) { int m; if(n == 0) return; scanf("%d", &m); n--; Nixu(n); printf("%d ", m); } 来源: https://www.cnblogs.com/Tinamei/p/4235412.html