精华内容
下载资源
问答
  • 程序每执行到一个方法时,就会开辟一个独立的空间(栈) 每个空间的数据(局部变量),独立的 一个方法执行完毕之后,或者遇到return,就会返回,谁调用,结果返回给谁。 递归迷宫问题 我们要使用递归的方法...

    递归

    本质上就是自己调用自己,每次调用的时候传入不同的变量。

    递归调用规则:

    1. 程序每执行到一个方法时,就会开辟一个独立的空间(栈)

    2. 每个空间的数据(局部变量),是独立的

    3. 一个方法执行完毕之后,或者遇到return,就会返回,谁调用,结果返回给谁。

    递归迷宫问题

    我们要使用递归的方法将下列map[1] [1]走到map[5] [4]。
    在这里插入图片描述

    思路分析:

    数组中,1代表墙,2代表走过的路径,3代表死胡同,不要走

    1) 创建一个二维数组作为map
    
    2) 创建一个boolean类型的递归
    
    	a)    判断是否到达终点
    
    		i.      到达,返回true
    
    ​        ii.      未到达,判断当前点是否为可以走的,map = 0
    
    			1. 可以走的话,将该点设置为2,用if-else尝试四个方向的走,用if来调用原函数,函数都返回true,如果四个方向都不能走,设置该点为3,返回false
    
    			2. 不能走的话直接返回false
    

    代码:

    package com.dataStructure;
    
    public class puzzleBackTracking {
        public static void main(String[] args) {
            int[][] map = new int[8][7];
            for (int i = 0; i <= 7; i++) {
                map[i][0] = 1;
                map[i][5] = 1;
            }
            for (int j = 1; j < 6; j++) {
                map[0][j] = 1;
                map[6][j] = 1;
            }
            map[3][1] = 1;
            map[3][2] = 1;
            //打印一下map
            for (int i = 0; i < 7; i++) {
                for (int j = 0; j < 6; j++) {
                    System.out.print(map[i][j] + " ");
                }
                System.out.println();
            }
            solving(map, 1, 1);
            //打印一下之后的map
            System.out.println("解puzzle后~~~");
            for (int i = 0; i < 7; i++) {
                for (int j = 0; j < 6; j++) {
                    System.out.print(map[i][j] + " ");
                }
                System.out.println();
            }
    
        }
    
    
        public static boolean solving(int[][] map, int i, int j) {
            if (map[5][4] == 2) {
                return true;     //如果到达终点,直接return
            } else {
                if (map[i][j] == 0) {
                    map[i][j] = 2;
                    //事实上,这个函数定义为boolean类型,纯粹是为了这里的判断
                    //判断是否可以继续按照这种方法走下去
                  
                    if (solving(map, i + 1, j)) {//先向下走
                        return true;
                    }else if (solving(map, i, j + 1)) {//向右走
                        return true;
                    }else if (solving(map, i - 1, j)) {//向上走
                        return true;
                    }else if (solving(map, i, j - 1)) {//向左走
                        return true;
                    } else {
                        map[i][j] = 3;
                        return false;
                    }
                } else {
                    return false;    //这里return false的原因主要是想尝试另一种走法让//if-else继续下去。
                }
            }
        }
    }
    
    
    
    
    展开全文
  • 要求按下列规则将所有圆盘移至C杆:每次只能移动一个圆盘;大盘不能叠在小盘上面。提示:可将圆盘临时置于B杆,也可将从A杆移出的圆盘重新移回A杆,但都必须尊循上述两条规则。问:如何移?最少要移动多少次?汉诺塔...

    1.汉诺塔是由三根杆子A,B,C组成的。A杆上有N个(N>1)穿孔圆盘,盘的尺寸由下到上依次变小。要求按下列规则将所有圆盘移至C杆:每次只能移动一个圆盘;大盘不能叠在小盘上面。提示:可将圆盘临时置于B杆,也可将从A杆移出的圆盘重新移回A杆,但都必须尊循上述两条规则。问:如何移?最少要移动多少次?汉诺塔是根据一个传说形成的一个问题:

    有三根杆子A,B,C。A杆上有N个(N>1)穿孔圆盘,盘的尺寸由下到上依次变小。要求按下列规则将所有圆盘移至C杆:

    每次只能移动一个圆盘;

    大盘不能叠在小盘上面。

    提示:可将圆盘临时置于B杆,也可将从A杆移出的圆盘重新移回A杆,但都必须尊循上述两条规则。

    问:如何移?最少要移动多少次?

     1 class Program
     2     {
     3         static int i = 1;
     4         static void move(int n, char from, char to) //将编号为n的盘子由from移动到to  
     5         {
     6             Console.WriteLine("第{0}步:将{1}号盘子{2}---->{3}\n", i++, n, from, to);
     7         }
     8         static void hanoi(int n, char from, char denpend_on, char to)//将n个盘子由初始塔移动到目标塔(利用借用塔)  
     9         {
    10             if (n == 1)
    11                 move(1, from, to);//只有一个盘子是直接将初塔上的盘子移动到目的地  
    12             else
    13             {
    14                 hanoi(n - 1, from, to, denpend_on);//先将初始塔的前n-1个盘子借助目的塔移动到借用塔上  
    15                 move(n, from, to);              //将剩下的一个盘子移动到目的塔上  
    16                 hanoi(n - 1, denpend_on, from, to);//最后将借用塔上的n-1个盘子移动到目的塔上  
    17             }
    18         }
    19         static void Main(string[] args)
    20         {
    21             Console.Write("请输入盘子的个数:\n");
    22             int n;
    23             n = Convert.ToInt32(Console.ReadLine());
    24             char x = 'A', y = 'B', z = 'C';
    25             Console.Write("盘子移动情况如下:\n");
    26             hanoi(n, x, y, z);
    27 
    28             
    29         }

    运行结果举例:

    2.猴子吃桃的问题

     1 static void Main(string[] args)
     2         {
     3             int a=Taozi(1);
     4             Console.WriteLine(a);
     5             
     6         }
     7         static int Taozi(int day)
     8         {
     9             if (day == 7)
    10             {
    11                 return 1;
    12             }
    13             int n = (Taozi(day + 1) + 1) * 2;
    14             return n;
    15         
    16         }

    3.做梦

     1  static void Main(string[] args)
     2         {
     3             //递归函数
     4             //做梦
     5             Test(1);
     6             Console.WriteLine();
     7         }
     8         static void Test(int n)
     9         {
    10             if (n>10)
    11             {
    12                 return;
    13             }
    14             Console.WriteLine("这是第{0}次在做梦",n);
    15             Test(n+1);
    16             Console.WriteLine("第{0}次梦醒了",n);
    17         }

    运行结果:

    4.折纸问题:

     static void Main5(string[] args)
            { 
            //折纸
                double houdu = 0.00008;
                 Zhezhi(houdu);
                Console.WriteLine(n);
            }
            
            static void Zhezhi(double h)
            {
                
                if (h>8848)
                {
                    return ;
                }
    
                   Zhezhi(h*2);
                     n++;
                          
            }

     

    转载于:https://www.cnblogs.com/kellybutterfly/p/5436256.html

    展开全文
  • 本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印 ...给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。 输入格式: ...

    本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印

    *****
     ***
      *
     ***
    *****
    

    所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。

    给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。

    输入格式:

    输入在一行给出1个正整数N(≤1000)和一个符号,中间以空格分隔。

    输出格式:

    首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。

    输入样例:

    19 *
    

    输出样例:

    *****
     ***
      *
     ***
    *****
    2

    思路:题目很简单,直接上代码;上下对称图形可以用递归法

    #include <iostream>
    #include <stdio.h>
    
    int solve(int n,int m,char c);
    int s_print(int n,int m,char c);
    
    int main( ) 
    {
    	int N,i,sum=-1;
    	char c;
    	scanf("%d %c",&N,&c);
    	
    	//相邻两行符号数差2,所以 i=i+2,i表示符号一行最大数目 
    	for(i=1;;i=i+2)
    	{
    		sum=sum+2*i;//sum表示预计总共符号数,sum>=N结束循环 
    		if(sum>=N)
    		{
    			break;
    		}
    	}
    	
    	if(sum>N)
    	{
    		//预计数目大于N,则应该输出行最大i-2,总共需摆放(sum-2*i)个 
    		solve(i-2,0,c);
    		printf("%d",N-(sum-2*i));//计算最后剩的符号数 
    	}	
    	else
    	{
    		solve(i,0,c);//刚好摆放完 
    		printf("%d",N-sum);
    	}
    	return 0;
    }
    
    int solve(int n,int m,char c)//递归法 
    {
    	if(n==1)//当n=1时,结束递归 
    	{
    		s_print(n,m,c);//打印一个符号 
    		return 0;
    	}
    	
    	s_print(n,m,c);//调用打印符号函数,上半部分输出 
    	
    	solve(n-2,m+1,c);//递归,调用本身,n-2每行比下一行少2个,m代表空格数目 
    	
    	s_print(n,m,c);//调用打印符号函数,上半部分输出  
    	
    	return 0;	
    }
    
    int s_print(int n,int m,char c)
    {
    	int i;
    	for(i=0;i<m;i++)//先输出空格 
    	{
    		printf(" ");
    	}
    	for(i=0;i<n;i++)//再打印符号 
    	{
    		printf("%c",c);
    	}	
    	printf("\n");
    	return 0;
    }

     

    展开全文
  • Problem D: 递归求和 Description 输入一组数字,用递归的方法求和。 Invalid Word(禁用单词)错误:在解决这个题目时,某些关键词不允许被使用的。...第一行输入一个正整数k(k<1000),第二...

    Problem D: 递归求和

    Description

    输入一组数字,用递归的方法求和。


    Invalid Word(禁用单词)错误:在解决这个题目时,某些关键词是不允许被使用的。如果提交的程序中包含了下列的关键词之一,就会产生这个错误。

    被禁用的关键字:循环语句for、while,甚至包括分支语句的switch、case、goto。

    Input

    第一行输入一个正整数k(k<1000),第二行为k个整数。

    Output

    输出这k个整数的和。

    Sample Input

    10
    1 2 3 4 5 6 7 8 9 10

    Sample Output

    55

    HINT

    Append Code

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int GetAnswer(int a,int sum){
        if(a == 0)return sum;
        else{
            int b = 0;
            scanf("%d",&b);
            sum = sum + b;
            GetAnswer(a - 1,sum);
        }
    }
    
    int main(){
        int n = 0;
        scanf("%d",&n);
        int sum = 0;
        int i = GetAnswer(n,sum);
        printf("%d",i);
    }
    

    就递归呗

    展开全文
  • 但是输入一个合乎规则的数字后,程序直接结束了,即一次性程序;</li><li>使用system(“pause”)后,执行没有暂停,会一直进行下去,也尝试过cin.ignore()࿰...
  • 全排列在笔试面试中很热门,因为它难度适中,既可以考察递归实现,又能进一步考察非递归的实现,便于区分出考生的水平。所以在百度和迅雷的校园招聘以及程序员和软件设计师的考试中都考到了,因此本文对全排列作下...
  • 递归算法教学内容.ppt

    2020-07-03 05:08:56
    第四单元 递归算法 ;考点与典例;典例1小明利用下面的方法求2i(2的i次方)的值:如果i=0,则2i=1,否则将2i转换为2*2i-1,而2i-1又可以转换为2...典例2下列VB程序中,f是一个递归函数 Function f(n As Integer) As Long If n=0
  • 给定一个整数键值序列,现请你编写程序,判断这是否对一棵二叉搜索树或其镜像进行前序遍历的结果。 输入格式: 输入的第一行给出正整数 N(≤1000)。随后一行给出 N 个整数键值,其间以空格分隔。 输出格式: ...
  • 递归组合

    2014-08-02 17:33:23
    6、 编程列出一个字符串的全字符组合情况,原始字符串中没有重复字符 例如:原始字符串"abc", 打印得到下列所有组合情况: "a" "b" "c" "ab" "bc" "ca" "ba" "cb" "ac" "abc" "acb" "bac" "bca" "cab" "cba"  */...
  • 给定一个整数键值序列,现请你编写程序,判断这是否对一棵二叉搜索树或其镜像进行前序遍历的结果。 输入格式: 输入的第一行给出正整数 N(≤1000)。随后一行给出 N 个整数键值,其间以空格分隔。 输出格式
  • 一棵二叉搜索树可被递归地定义为具有下列性质的二叉树:对于任一结点, ...给定一个整数键值序列,现请你编写程序,判断这是否对一棵二叉搜索树或其镜像进行前序遍历的结果。 输入格式: ...
  • Problem D: 递归求阶乘

    2020-12-16 18:32:58
    现在,你需要编写一个程序计算一个整数n的阶乘。不过,这次你只能使用递归的方法来实现。 Invalid Word(禁用单词)错误:在解决这个题目时,某些关键词不允许被使用的。如果提交的程序中包含了下列的关键词之一...
  • Problem C: 递归求阶乘

    2020-12-16 16:21:35
    现在,你需要编写一个程序计算一个整数n的阶乘。不过,这次你只能使用递归的方法来实现。 Invalid Word(禁用单词)错误:在解决这个题目时,某些关键词不允许被使用的。如果提交的程序中包含了下列的关键词之一...
  • 本题要求实现一个函数,计算下列简单交错幂级数的部分和: f(x,n)=x−x​2​​+x​3​​−x​4​​+⋯+(−1)​n−1​​x​n​​ 函数接口定义: double fn( double x, int n ); 其中题目保证传入的n正整数,...
  • 函数的重入与递归

    2020-08-30 15:06:05
    所谓重入,就是指某段子程序还没有执行完,就因为中断或者多任务操作系统的调度原因,导致该子程序一个新的寄存器上下文中被执行 引发函数重入的原因 中断 任务调度 递归 函数可重入的条件 一个可重入的函数...
  • 首先由两种解决方式,第种会想到递归,因为这样代码逻辑简单所以我第感觉也递归算法于是写了下列测试代码计算 f(1-100) 得数 逻辑简单粗暴代码通俗易懂,但是当我主程序调用的时候问题就来了,由于调用次数太...
  • 本题要求实现一个函数,计算下列简单交错幂级数的部分和: f(x,n)=x−x​2​​+x​3​​−x​4​​+⋯+(−1)​n−1​​x​n​​ 函数接口定义: double fn( double x, int n ); 其中题目保证传入的n正整数,并且...
  • 如果提交的程序中包含了下列的关键词之,就会产生这错误。 被禁用的关键字:for, while, do, break, continue, goto。 Input 输入若干字符串,每个一行,不超过100,每串长度不超过100字符。 Output 按...
  • 输入:一个表达式,例如”i*i+i-i“。 输出:该表达式的分析,例如(打印倒着的): 2、程序总体设计思路和框架 无回溯递归下降分析要先手动求出select集,为了避免手动求解的麻烦(主要懒),采用有回溯递归...
  • 为G的每个非终结符号U构造一个递归过程,不妨命名为U。 U的产生式的右边指出这个过程的代码结构: (1)若是终结符号,则和向前看符号对照, 若匹配则向前进一个符号;否则出错。 (2)若是非终结符号,则调用与此非终结...
  • 本题要求实现一个函数,计算下列简单交错幂级数的部分和: f(x,n)=x−x2+x3−x4+...+(−1)n−1xnf(x,n)=x-x^2+x^3-x^4+...+(-1)^{n-1}x^nf(x,n)=x−x2+x3−x4+...+(−1)n−1xn 函数接口定义: double fn( double x, ...
  • 编写函数:递归求逆序 (Append Code)

    千次阅读 2018-02-25 19:32:56
    将输入的一个字符串s逆序输出。 编写函数recursive()完成程序: 原型:int recursive(); 功能:用递归的方法读取输入,并且逆序输出。 函数的调用格式见“Append Code”。 Invalid Word(禁用单词)错误:...
  • 本题要求实现一个函数,计算下列简单交错幂级数的部分和: f(x,n)=x−x​2​​+x​3​​−x​4​​+⋯+(−1)​n−1​​x​n​​ 函数接口定义: double fn( double x, int n ); 其中题目保证传入的n正整数,...
  • 将输入的一个字符串s逆序输出。 编写函数recursive()完成程序: 原型:int recursive(); 功能:用递归的方法读取输入,并且逆序输出。 函数的调用格式见“Append Code”。 Invalid Word(禁用单词)错误:在解决这...
  • 本题要求实现一个函数,计算下列简单交错幂级数的部分和: ​​ 函数接口定义: double fn( double x, int n ); 其中题目保证传入的n正整数,并且输入输出都在双精度范围内。函数fn应返回上述级数的部分和。建议...
  • 本题要求实现一个函数,计算下列简单交错幂级数的部分和: ​ 函数接口定义: double fn( double x, int n ); 其中题目保证传入的n正整数,并且输入输出都在双精度范围内。函数fn应返回上述级数的部分和。建议...
  • 本题要求实现一个函数,计算下列简单交错幂级数的部分和: f(x,n)=x−x​2​​+x​3​​−x​4​​+⋯+(−1)​n−1​​x​n​​ 函数接口定义: double fn( double x, int n ); 其中题目保证传入的n正整数,...
  • 将输入的一个字符串s逆序输出。 编写函数recursive()完成程序: 原型:int recursive(); 功能:用递归的方法读取输入,并且逆序输出。 函数的调用格式见“Append Code”。 Invalid Word(禁用单词)错误:在解决这...

空空如也

空空如也

1 2 3 4 5 ... 15
收藏数 282
精华内容 112
关键字:

下列是一个递归程序