今天看到一个苹果的递归方法,仔细看了一看,感觉理解还是有一定难度……
要设计一个递归函数,明确这个递归函数的定义,在这个函数里面反复调用自己从而求出问题的解。递归很多时候用于求有多少种解法的题目:这时要分清有多少种情况,然后把每一种情况产生的解的个数相加。
这里有一道经典的递归问题,一般基础语言书上都会有利用递归求斐波那契数,还有汉诺塔的问题都可以用递归。本文主要学习一下放苹果的问题,问题刚开始分析的时候有一定难度,但代码实现比较简单,而且方法不唯一。
如题:
M个同样的苹果放N个同样的盘子,允许有盘子空着, 问有多少种放法。注意:5 1 1和1 5 1是同一种放法
函数用fun(int m,int n)来表示,其中m为苹果的个数,n为篮子的数量。
分析:分两种情况:a.至少有一个盘子为空,此时放法种数与减去这个空盘子的放法种数相同,函数为fun(m,n-1)。b.所有盘子都不为空,此时可以从每个盘子里拿掉一个苹果而不影响放法种数,函数为fun(m-n,n)。
因此总数为:fun(m,n)=fun(m,n-1)+fun(m-n,n)
显然m<n时,只能满足第一种情况。
利用Java实现代码为:
package com.swjtu.other.pric;
import java.util.Scanner;
public class Apple {
public static void main(String[] args) {
System.out.println("请输入苹果的个数,且为非负整数:");
Scanner mc = new Scanner(System.in);
int apple = mc.nextInt();
System.out.println("请输入篮子的个数:");
Scanner nc = new Scanner(System.in);
int basket = nc.nextInt();
Apple creatApple = new Apple();
System.out.println(" 总共有 " + creatApple.fun(apple, basket) + " 种放法!");
}
public int fun(int m,int n){
if(m<=1||n==1)
return 1;
else if ( n == 0)
return 0;
else if(n>m)
return fun(m,n-1);
return fun(m-n,n) + fun(m,n-1);
}
}
实现结果截图为: