public static int sum(int[] a, int n){ return n>0?(sum(a,n-1)+a[n]):a[n]; } int[] a = {1,2,3,4,5,6,7,8,9}; sum(a, 8) //表示计算a[0] --- a[8] -------------------------------------- 如果考虑到n的问题,这样: return n>0?(n>a.length-1?sum(a,n-1):sum(a,n-1)+a[n]):a[n];sum(a, 100)
jdk1.5里面,有foreach类似于.net里的, 不知道能否用得上.
如果是设n为数组的长度的话int sum(int a[], int n){ return n > 0 ? a[n-1] + sum(a, n - 1) : 0; }思路: 长度为n的数组求和 = a[n-1] + 长度为n-1的数组求和 当长度n = 0时,数组和为0ps: a[n-1]为长度为n的数组的最大下标的元素
哈哈,大家上当了吧,用递归效率太低,跟大家说个好的方法吧 int sum(final int a[],final int n){ return n>0? new Object(){ public int sums(){ int temp = 0; for(int i = 0;i<a.length;i++){ temp += a[i]; } return temp; } }.sums() : 0 ;写程序最忌讳的就是用递归,所以我使用匿名内不类,但它要求参数为final的,但是我们知道,在能够使用final的地方使用它是个好的习惯
n 是什么? 数组长度? class sum { public static void main(String [] args) {
int n; long sums; int a[] = {1,2,3,4,5}; n = 3; sums = sum(a,n); System.out.println(sums); } static int sum(final int a[],final int n) { return n>0? new Object() { public int sum() { int sums = 0; for(int i = 0;i<a.length;i++) { sums += a[i]; } return sums; } }.sum() : 0 ;
} }
TO xiaoqulai(肖曲来):同意你的观点,“递归”这东西,虽然有它的好处,但不能滥用。像给数组求和这种事情也用递归,如果数组大一点的话,岂不很快就“递归到死”了 :)不过,你好像没看到我前面的一个帖子,我给出了一个跟你类似的解决方法,也是定义了一个匿名类,不同之处在于,匿名类里的计算方法是带参数的。这就避免了你说的“把题目中的参数修改为 final”以及“用单例模式”的麻烦。我那个帖子空格里填的是: (n>a.length ? Integer.MAX_VALUE : ( new Object(){int sum(int a[],int n){int s=0; for (int i=0; i<n; i++) s+=a[i]; return s;}}.sum(a,n) )) : Integer.MIN_VALUE
int sum(int a[],int n){ return n>0?__________________________; } 这是题目, 你添的是: int sum(int a[],int n){ return (n>0?__________________________;//前面多了一个括号,这样我调了,不报错. } 还是 int sum(int a[],int n){ return n>0?_(_________________________; }我刚才又分析了你代码(分了几段,好读,呵呵),不过说实话,我不晓得n是什么意思,起什么作用, 拿你这个例子来说,假如有个树组a[1] = 1,a[2] = 2, a[3] = 3,现在我传如数组a[],n = -1,这样的这个函数好象不起作用啊~~调试程序如下: public class test { /** * @param args */ public static void main(String[] args) { // TODO 自动生成方法存根 int a[] = new int[3]; a[0] = 1; a[1] = 2; a[2] = 3; test aTest = new test(); System.out.println(aTest.sum(a,1)); } int sum(int a[],int n){ return n>0 ? (n>a.length ? Integer.MAX_VALUE : ( new Object(){int sum(int a[],int n){int s=0; for (int i=0; i<n; i++) s+=a[i]; return s;}}.sum(a,n) )) : Integer.MIN_VALUE; } }输出结果为1在用我的试试: public class test { /** * @param args */ public static void main(String[] args) { // TODO 自动生成方法存根 int a[] = new int[3]; a[0] = 1; a[1] = 2; a[2] = 3; test aTest = new test(); System.out.println(aTest.sum(a,1)); } /* int sum(int a[],int n){ return n>0 ? (n>a.length ? Integer.MAX_VALUE : ( new Object(){int sum(int a[],int n){int s=0; for (int i=0; i<n; i++) s+=a[i]; return s;}}.sum(a,n) )) : Integer.MIN_VALUE; }*/
int sum(final int a[],final int n){ return n>0? new Object(){ public int sums(){ int temp = 0; for(int i = 0;i<a.length;i++){ temp += a[i]; } return temp; } }.sums() : 0 ; } }结果为6,是正确的,哈哈
我明白你的代码的意思啦. 额,你好强.我改进了我代码,兄弟们,最终版出来拉: int sum(int a[],int n){ return n>0? new Object(){ public int sums(int a[],int n){ int temp = 0; for(int i = 0;i<=n; i++){ temp += i; } return temp; } }.sums(a,n) : -1; }
return n>0?(sum(a,n-1)+a[n]):a[n];
}
int[] a = {1,2,3,4,5,6,7,8,9};
sum(a, 8) //表示计算a[0] --- a[8]
--------------------------------------
如果考虑到n的问题,这样:
return n>0?(n>a.length-1?sum(a,n-1):sum(a,n-1)+a[n]):a[n];sum(a, 100)
不知道能否用得上.
return n > 0 ? a[n-1] + sum(a, n - 1) : 0;
}思路:
长度为n的数组求和 = a[n-1] + 长度为n-1的数组求和
当长度n = 0时,数组和为0ps: a[n-1]为长度为n的数组的最大下标的元素
虽然估计外面调用的时候肯定是写成sum(a, a.length),也不能排除其他情况。
return n>0?(sum(a,n-1)+a[n-1]):0;1。sum(a,n-1)调用函数本身实现递归
2。n是你想把数组中的几个值求和,如果小于0则返回int 0 以表示忽略执行此函数,实际功能实现中可用if判断一下,if(sum(a,n) != 0)时才做sum(a,n)操作,如:
if(sum(a,n) != 0){
sum(a,n)
}else{
throw new Exception failException("无效参数");
}
Thanks
Hima
public class Test14 {
public static void main(String[] args) {
Test14 o = new Test14();
int[] a = new int[] {1,2,3,4};
System.out.println(o.sum(a, a.length));
}
int sum(int a[],int n){
return n>0 ? (n>a.length ? Integer.MAX_VALUE : ( new Test14(){int sum(int a[],int n){int s=0; for (int i=0; i<n; i++) s+=a[i]; return s;}}.sum(a,n) )) : Integer.MIN_VALUE ;
}
}递归虽好,也只在需要的时候再用。程序员,没事儿玩玩技巧无妨,也有助于学习,千万别走火入魔。出这种面试题,不知道想招什么样的人,误人子弟呀。
return n>0?(a[n-1]+sum(a,--n)):0; 递归
}
int sum(int a[],int n){
return n>0?return(a[n-1] + sum(a,n-1)):0;
}
{ int[] a = {1,2,3,4,5,6,7,8,9};
ABC b=new ABC();
System.out.println(b.sum(a,8));
}
}class ABC
{
int sum(int a[],int n)
{
return n>0?(sum(a,n-1)+a[n]):a[n];
}
}
int sum(int a[],int n){ return n>0?a[n]+sum(a,n-1):a[0];
}这么简单,为什么最后的a[0]都变成0了,莫非a[0]===0(某种语言里的恒等)
}
难道真的全是错的吗???
int sum(int a[],int n)
这里的n应该是数组的大小吧:就像C++里面定义int a[10]里面的10一样,难道你能这样用吗?
a[10]=20;????
所以我想楼上写的这些才是正解吧
int sum(int a[],int n){ return n>0?__________sum(a,n--)+a[n-1]:0________________;
}
这里一个式子肯定要递归处理操作,? 处理判断逻辑
? 这种题,当游戏玩玩可以,在项目中用的话,就是犯贱
================================================================
何止犯贱!当数组很大时,栈空间一下就不够用了
1。没有考虑到n>a.length的情况,即使考虑到都没有给出有效的解决方案。
2。多数人把n<=0时的结果以0盖之,个人觉得不妥,会让人误以为数组长度<=0时,运算结果是零,这是误导,还不如索性让结果出现runtime error。其实最佳的解决方案是:
static int sum(int a[],int n)throws Exception{
return n>0?(sum(a,n-1)+a[n-1]):a[n-1];
}
主动抛出个异常,用户在调用方法时必须catch这个异常。
注意最后是a[n-1]而不是a[n](在n=0是会出现错误结果)。但由于这是个填空题,不能修改题目部分,所以折中方案是:
static int sum(int a[],int n){
return n>0?(n>a.length?sum(a,a.length-1)+a[a.length-1]:sum(a,n-1)+a[n-1]):0;
}
这样当n>a.length时强制结果为n=a.length 而在n<=0时强制为0
public int sums(){
int temp = 0;
for(int i = 0;i<a.length;i++){
temp += a[i];
}
return temp;
}
}.sums() : 0 ;写程序最忌讳的就是用递归,所以我使用匿名内不类,但它要求参数为final的,但是我们知道,在能够使用final的地方使用它是个好的习惯
如果这个题拿来考我,我是就这样做,如果你非要说我把int a[]和int n的前面加了一个final,不符和题意思,那么我换一个写法,先在外面写个类,然后在这里用单例模式,即调用相应的静态方法来得到一个实例,在用得到的实例调用求和的方法,反正打死我,也不用递归.
class sum
{
public static void main(String [] args)
{
int n;
long sums;
int a[] = {1,2,3,4,5}; n = 3;
sums = sum(a,n);
System.out.println(sums);
}
static int sum(final int a[],final int n)
{ return n>0? new Object()
{
public int sum()
{
int sums = 0;
for(int i = 0;i<a.length;i++)
{
sums += a[i];
}
return sums;
}
}.sum() : 0 ;
}
}
(n>a.length ? Integer.MAX_VALUE : ( new Object(){int sum(int a[],int n){int s=0; for (int i=0; i<n; i++) s+=a[i]; return s;}}.sum(a,n) )) : Integer.MIN_VALUE
我第一眼看到这个题,就想到,如果不用递归的话,我只能在API中找一个提供静态方法的类(已经存在的),但一望下看,就看到您的方法了。请原谅我再想不出别的方法了,但我又不甘心,所以我在实现匿名内部类后,有跟了一贴:
------------------------------------------------------------------
接上贴,
如果这个题拿来考我,我是就这样做,如果你非要说我把int a[]和int n的前面加了一个final,不符和题意思,那么我换一个写法,先在外面写个类,然后在这里用单例模式,即调用相应的静态方法来得到一个实例,在用得到的实例调用求和的方法,反正打死我,也不用递归.
-----------------------------------------------------------------------
不同的是,我在这个方法外面在写一个类,提供比较方法,跟你的区别是,你用了Integer类的静态方法,而我是自己写一个类,调用它的静态方法。接触JAVA还不到一个月,有什么问题大家不要骂我!
感觉CSDN上种有些人一天到晚在骂人
To maquan:我理解错了,不过你好象也该了题了:
int sum(int a[],int n){ return n>0?__________________________;
}你在n>0前加了个括号 (n>0.....
我的虽然参数要加final,但return 是符合标准的,哈哈
(n>a.length ? Integer.MAX_VALUE : ( new Object(){int sum(int a[],int n){int s=0; for (int i=0; i<n; i++) s+=a[i]; return s;}}.sum(a,n) )) : Integer.MIN_VALUE不过,我很喜欢你的爽快 ^O^ 握个手吧。最近看到你的帖子,总说自己学 JAVA 不久,但我发现你对一些问题理解得挺深的,由衷佩服!
}
这是题目,
你添的是:
int sum(int a[],int n){ return (n>0?__________________________;//前面多了一个括号,这样我调了,不报错.
}
还是
int sum(int a[],int n){ return n>0?_(_________________________;
}我刚才又分析了你代码(分了几段,好读,呵呵),不过说实话,我不晓得n是什么意思,起什么作用,
拿你这个例子来说,假如有个树组a[1] = 1,a[2] = 2, a[3] = 3,现在我传如数组a[],n = -1,这样的这个函数好象不起作用啊~~调试程序如下:
public class test { /**
* @param args
*/
public static void main(String[] args) {
// TODO 自动生成方法存根
int a[] = new int[3];
a[0] = 1;
a[1] = 2;
a[2] = 3;
test aTest = new test();
System.out.println(aTest.sum(a,1)); }
int sum(int a[],int n){ return n>0 ? (n>a.length ? Integer.MAX_VALUE : ( new Object(){int sum(int a[],int n){int s=0; for (int i=0; i<n; i++) s+=a[i]; return s;}}.sum(a,n) )) : Integer.MIN_VALUE;
}
}输出结果为1在用我的试试:
public class test { /**
* @param args
*/
public static void main(String[] args) {
// TODO 自动生成方法存根
int a[] = new int[3];
a[0] = 1;
a[1] = 2;
a[2] = 3;
test aTest = new test();
System.out.println(aTest.sum(a,1)); }
/* int sum(int a[],int n){ return n>0 ? (n>a.length ? Integer.MAX_VALUE : ( new Object(){int sum(int a[],int n){int s=0; for (int i=0; i<n; i++) s+=a[i]; return s;}}.sum(a,n) )) : Integer.MIN_VALUE;
}*/
int sum(final int a[],final int n){ return n>0? new Object(){
public int sums(){
int temp = 0;
for(int i = 0;i<a.length;i++){
temp += a[i];
}
return temp;
}
}.sums() : 0 ;
}
}结果为6,是正确的,哈哈
额,你好强.我改进了我代码,兄弟们,最终版出来拉:
int sum(int a[],int n){ return n>0? new Object(){
public int sums(int a[],int n){
int temp = 0;
for(int i = 0;i<=n; i++){
temp += i;
}
return temp;
}
}.sums(a,n) : -1;
}