递归习题

 一个人赶着鸭子去每个村庄卖,每经过一个村子卖去所赶鸭子的一半又一只。这样他经过了
 七个村子后还剩两只鸭子,问他出发时共赶多少只鸭子?经过每个村子卖出多少只鸭子?
/*
 * Author:大壳
 * Date:2018/11/17
 * Version:Ecplise
 * Describation:利用递归,计算鸭子数
 */
public class Dark {
	
		static int sum = 2;//鸭子数
		static int sell;//卖出的鸭子数
		/**
		 * 利用递归,计算经过每个村庄卖出的鸭子数和鸭子的总数
		 * @param city
		 * @return
		 */
	public static int dark(int city){
	
		if(city == 1){//递归出口
			System.out.println("出发时总共赶利了"+sum+"只鸭子");
		}else{
			//计算经过每个村庄前的鸭子数
			sum = (sum+1)*2;
			//计算经过每个村庄卖出的鸭子数
			sell = sum/2+1;
			System.out.println("经过第"+city+"村庄卖出鸭子"+sell);
			return dark(city-1);
		}
		return sum;
	}
	
	public static void main(String[] args) {
		dark(7);
	}
}


import java.util.Scanner;
/*
 * Author:大壳
 * Date:2018/11/17
 * Version:Ecplise
 * Describation:利用递归,解决角谷定理
 * 题目:角谷定理。输入一个自然数,若为偶数,则把它除以2,若为奇数,则把它乘以3加1。
 * 经过如此有限次运算后,总可以得到自然数值1。求经过多少次可得到自然数1。
 * 如:输入22,
 * 输出 22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1
 *  STEP=16
 */
public class JiaoGu {
	
	Scanner scan = new Scanner(System.in);
	int number = scan.nextInt();  //输入一个自然数
	int count = 1;//记录计算的次数
	
	/**
	 * 利用递归,输出每次处理后的数,并且得到处理的次数
	 */
	public  void jiaogu(){
		
		if(number == 1){//递归出口
			System.out.println("经过"+count+"次可得到自然数1");
		}else if(number % 2 == 0){//输入的数为偶数
			number = number / 2;
			System.out.println(number);
			count++;
			jiaogu();
		}else{//输入的数为奇数
			number = number*3+1;
			System.out.println(number);
			count++;
			jiaogu();
		}
	}
	
	public static void main(String[] args) {
		new JiaoGu().jiaogu();
	}
}

package zuoye;
/*
 * Author:大壳
 * Date:2018/11/17
 * Version:Ecplise
 * description:分桔子问题。
 * 题目:日本著名数学游戏专家中村义作教授提出这样一个问题:父亲将2520个桔子分给六个儿子。
 * 分完 后父亲说:“老大将分给你的桔子的1/8给老二;老二拿到后连同原先的桔子分1/7给老三;
 * 老三拿到后连同原先的桔子分1/6给老四;老四拿到后连同原先的桔子分1/5给老五;
 * 老五拿到后连同原先的桔子分1/4给老六;老六拿到后连同原先的桔子分1/3给老大”。
 * 结果大家手中的桔子正好一样多。问六兄弟原来手中各有多少桔子?
 */
public class Orange {
	
	public static void main(String[] args) {
		int i = 0;
		int [] orange = {420,420,420,420,420,420};//经过分配后每个兄弟现有的桔子数
		
		for(i = 5; i > 0 ;i--) {//计算每个兄弟再没有给别人分配前的桔子数
			orange[i] =orange[i] *(8-i)/(7-i);
		}
		
		
		orange[0] = 210*8/7;  //老大原有的桔子数
		
		for(i = 5;i> 0 ;i--) {//计算老2到老6原有的桔子数
			
			orange[i] -= orange[i-1]/(9-i);//原有的桔子数=在没给别人分配之前的桔子数-得到别人给的桔子数
		}
		
		for(i = 0;i<6;i++) {//输出每个兄弟的桔子数
			System.out.println("第"+(i+1)+"个兄弟手中的桔子为:"+orange[i]);
		}
	}
}

#include<stdio.h>
#include<string.h>
/*
Author:大壳
Date:2018/11/17
Version:Visual C++ 6.0
Description:使用递归解决电话号码对应的字母组合问题
题目:电话号码对应的字符组合:在电话或者手机上,一个数字如2对应着字母ABC,
7对应着PQRS。那么数字串27所对应的字符的可能组合就有3*4=12种(如AP,BR等)。
现在输入一个3到11位长的电话号码,请打印出这个电话号码所对应的字符的所有可能组合和组合数。
*/


//定义数组arr,存放每个数字代表的字母
char arr[10][10]={"","","ABC", "DEF","GHI","JKL","MNO","PQRS","TUV","WXYZ"};
//各个数字代表的字符总数构成的数组 
int num[10]={0,0,3,3,3,3,3,4,3,4}; 
//定义数组telphone,存放输入的电话号码 
char telphone[11];	
//定义数组combination,存放数字代表的所有字母的组合
char combination[11];

/*
通过递归,把每个数字代表的字母组合依次输出
*/
void display(int index,int len){  	
	if(index==len){   //递归程序的出口
		combination[len]='\0';   
	    printf("%s\n",combination);
	}
	for(int i=0;i<num[telphone[index]];i++){ 
		combination[index]=arr[telphone[index]][i];
		display(index+1,len);
	}	
}


int main(){
	printf("请输入电话号码:\n");
	scanf("%s",telphone); 
	int len = strlen(telphone);  //获取输入电话号码的长度
	int sum=1;    //记录数字所代表的字母组合的总数
	for(int i=0;i<len;i++){
	    telphone[i] -= '0';   //char类型转换成int类型数组 
		sum*=(int)num[telphone[i]];
	}
	display(0,len);
	printf("组合总数:%d\n",sum);
	return 0;
}

第四道题用的是c语言,尝试用Java写过,但是中间处理输入的电话号码时,有问题没能解决,所以改用了c写。
总结:递归问题,主要是通过分析,找到问题的循环点,弄清楚递归的入口和出口。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值