经典递归 苹果的放法


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

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

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

如题:

  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);
	}

}
实现结果截图为:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值