经典递归 苹果的放法

来源:互联网 发布:农村淘宝村招募如何 编辑:程序博客网 时间:2024/06/09 18:12

 今天看到一个苹果的递归方法,仔细看了一看,感觉理解还是有一定难度……

设计一个递归函数,明确这个递归函数的定义,在这个函数里面反复调用自己从而求出问题的解。递归很多时候用于求有多少种解法的题目:这时要分清有多少种情况,然后把每一种情况产生的解的个数相加。

这里有一道经典的递归问题,一般基础语言书上都会有利用递归求斐波那契数,还有汉诺塔的问题都可以用递归。本文主要学习一下放苹果的问题,问题刚开始分析的时候有一定难度,但代码实现比较简单,而且方法不唯一。

如题:

  M个同样的苹果放N个同样的盘子,允许有盘子空着问有多少种放法。注意:5 1 11 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);}}
实现结果截图为:

0 0
原创粉丝点击