求编写一个递归程序的思路

东成同学 2013-04-10 12:11:57
我刚学java没多久,而且数学很一般......
题目是: 给定大于0的整数n,要求输出由 1元、2元和5元纸币组成的n元钱的所有方案 . ...要有解题的思路和相应的代码(希望有注释)....用递归方法..我数学不太好...汉诺塔问题都没有完全理解..希望讲的详细些 ....
当然,不用递归也行, 给出思路和代码... ..
求给位大神指点一下 ...
...全文
456 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
fxhbeyond 2013-04-10
  • 打赏
  • 举报
回复
思路:先找出最大的数字,此题中是5元,然后用n除以5元,得到商和余数,for循环,递减这个商,余数作为n递归调用此方法,直到商为0 自己先思考尝试做做 稍后给你代码看看
tianma630 2013-04-10
  • 打赏
  • 举报
回复
思路: 先算出1元2元5元的极端情况 1、全是1元 :n/1 = a 2、全市2元:n/2 = b 3、全市5元:n/5 = c 也就是1元在0-a张之间 2元在0-b张之间 5元在0-c张之间 最后 for(int i=0;i<=c;i++){ for(int j=0;j<=b;j++){ for(int k=0;k<=a;k++){ if(5*i+2*j+1*k=n){ system.out.print(i+','+j+','+k); } } } }
百八烦恼风 2013-04-10
  • 打赏
  • 举报
回复
引用 2 楼 xinxi_xiaodai 的回复:
public class TestMoney { public static void main(String[] args) { test(10); } public static void test(int N) { for(int x=0; x<=N; x++) { for(int y=0; y<=N; y++) { for(int z=0; z<……
public static void main(String[] args) {
		int num=5;
		int count=0;
		for(int i=0;i<=num;i++){
			for(int j=0;j<=num/2;j++){
				for(int k=0;k<=num/5;k++){
					if((i+2*j+5*k)==num){
						count++;
						System.out.println("1元:"+i+"\t2元:"+j+"\t5元:"+k);
					}
				}
			}
		}
		System.out.println(count);
	}
不用每次都循环整个吧?递归应该怎么做呢?
fingerPower 2013-04-10
  • 打赏
  • 举报
回复
题意没太看懂, 递归的话搞个简单的,就拿获取文件夹中的文件为例吧, File file = new File("d:") File [] fileList = null; public void getAllFile() { if (file.isDectory()) { fileList = file.list(); for (int i=0;i<fileList.length;i++) { getAllFile(); } } } 简单的写了下,应该有些小问题什么的,不过思路就是这样的,当你满足某一个条件后,就会重复调用同一个方法。 楼主可以去baidu搜索一下递归的例子。
小飞侠168 2013-04-10
  • 打赏
  • 举报
回复
这个应该可以,看看
小飞侠168 2013-04-10
  • 打赏
  • 举报
回复
public class TestMoney { public static void main(String[] args) { test(10); } public static void test(int N) { for(int x=0; x<=N; x++) { for(int y=0; y<=N; y++) { for(int z=0; z<N; z++) { if((1*x + 2*y + 3*z) == N){ System.out.println("x:" + x + " y:" +y + " z:" + z); } } } } } }
zzt369880281 2013-04-10
  • 打赏
  • 举报
回复
建议还是楼主自己写,然后到这里来找人帮忙找错
Inhibitory 2013-04-10
  • 打赏
  • 举报
回复
其实这个题用递归并不是很好,但是能做.
public class Hello {
    public static void foo(int n) {
        if (n < 1) { return; }

        if (n >= 5) {
            System.out.print(5 + ", ");
            foo(n - 5);
        } else if (n >= 2) {
            System.out.print(2 + ", ");
            foo(n - 2);
        } else if (n >= 1) {
            System.out.print(1 + ", ");
            foo(n - 1);
        }
    }

    public static void main(String[] args) {
        foo(18);
    }
}
kosora曹 2013-04-10
  • 打赏
  • 举报
回复
如果想选出不重复的组合,请参考: http://bbs.csdn.net/topics/390415529 参考6楼的回复,还可以兼容负数;不过,算法用的广度搜索思想,是非递归的;如果想改成递归,只需对解空间进行深度优先搜索。
东成同学 2013-04-10
  • 打赏
  • 举报
回复
引用 5 楼 coolboyyzy 的回复:
引用 2 楼 xinxi_xiaodai 的回复:public class TestMoney { public static void main(String[] args) { test(10); } public static void test(int N) { for(int x=0; x<=N; x++) { for(int y=0; y<=N……
这是代码...思路下面有回复....这道题我主要是想熟悉下递归的问题 ... public class J_money { private static int[] data={1,2,5}; public static void main(String[] args) { digui(10,0,""); } public static void digui(int n,int base,String result) { if(n<0) return; if(n==0) { System.out.println(result); return; } for(int i=base;i<data.length;i++) //当base为0时,n由1、2、5组成basen=1时,n由2、5组成 base=5时,n由5组成 { digui(n-data[i],i,result+data[i]+"|"); } } }
东成同学 2013-04-10
  • 打赏
  • 举报
回复
引用 2 楼 xinxi_xiaodai 的回复:
public class TestMoney { public static void main(String[] args) { test(10); } public static void test(int N) { for(int x=0; x<=N; x++) { for(int y=0; y<=N; y++) { for(int z=0; z<……
n元由1、2、5元组成...X++,Y++,肯定会出现不是题目要的组合....而且主要思路不对,这不是求解三元一次方程....
东成同学 2013-04-10
  • 打赏
  • 举报
回复
[quote=引用 7 楼 fxhbeyond 的回复:] 思路:先找出最大的数字,此题中是5元,然后用n除以5元,得到商和余数,for循环,递减这个商,余数作为n递归调用此方法,直到商为0 自己先思考尝试做做 稍后给你代码看看[/quote 现在才能上网。。。这道题在吃饭的时候重新想了一下。。。用递归的方法做 应该是这样解: 给出一个整数n,因为n元有1、2、5元组成 a.我们只要求解出 (n-1)元的组成方法+一元 b.我们只要求解出(n-2)元的组成方法+二元 c.我们只要求解出(n-5)元的组成方法+五元 n-1,n-2,n-5元都是重复以上步骤,不过要注意重复的组合,当 n=0,也即组成完毕,然后输出组合. 我的代码是 package com.ch3; public class J_money { private static int[] data={1,2,5}; public static void main(String[] args) { digui(10,0,""); } public static void digui(int n,int base,String result) { if(n<0) return; if(n==0) { System.out.println(result); return; } for(int i=base;i<data.length;i++) //当base为0时,n由1、2、5组成basen=1时,n由2、5组成 base=5时,n由5组成 { digui(n-data[i],i,result+data[i]+"|"); } } }
分不分布式 2013-04-10
  • 打赏
  • 举报
回复
个人觉得这个不用递归,用i++好点。这里不怎么适用递归思想

62,621

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧