一个人赶着鸭子去每个村庄卖,每经过一个村子卖去所赶鸭子的一半又一只。这样他经过了
七个村子后还剩两只鸭子,问他出发时共赶多少只鸭子?经过每个村子卖出多少只鸭子?
/*
* 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写。
总结:递归问题,主要是通过分析,找到问题的循环点,弄清楚递归的入口和出口。