我必须使用递归打印n的方块,我必须首先打印以降序排列的奇数,然后按升序排列偶数。
奇数排序代码正在工作,而我的偶数排序代码不是。
我已将问题分为两种方法,然后将其合并为一种,第一种方法将按降序打印出方形奇数,然后第二种方法将#34;#34;按升序打印平方偶数:
你走了:
public static String printSquares(int n) {
// Prints out the squares to n
// Odd numbers first in descending order
// Even numbers next in ascending order
return oddsSquared(n) + evensSquared("", n);
}
public static String evensSquared(String s, int n) {
// I have no idea why this is not working
if (n < 0) {
throw new IllegalArgumentException("Illegal Argument");
}
if (n == 2) {
return 2*2 +" "+ s;
} else if (n % 2 == 0) {
s = n * n +" "+ s;
return s + evensSquared(s, n--);
} else {
return evensSquared(s, n--);
}
}
public static String oddsSquared(int n) {
if (n < 0) {
throw new IllegalArgumentException("Illegal Argument");
}
if (n == 1) {
return 1 + "";
} else if (n % 2 != 0) {
return n * n + " " + oddsSquared(n - 1);
} else {
return oddsSquared(n - 1);
}
}
答案 0 :(得分:0)
您的第一个问题是您使用n--
在您的奇数代码中,您使用n-1
调用函数内部的n-1
实际返回n=5
(很明显我知道)。例如,如果n-1
然后4
返回n--
。
但在您的偶数代码中,您使用n-1
调用函数内部的n
但不返回n--
。n
。 (这就是它的棘手问题)。 n=5
返回n--
,然后应用减去1.因此,如果您有--n
,那么n
将返回5.
您可以使用n-1
在返回之前首先应用减1到s = n * n +" "+ s;
return s + evensSquared(s, n--);
,或者使用不会造成混淆的s = n * n +" "+ s;
return evensSquared(s, n--);
,以避免错误。
你的第二个问题是:
bool throwException = pList
.GroupBy(x => new { x.Type, x.AccessType, x.Value })
.Any(g => g.Select(p => p.Action).Distinct().Count() > 1);
您正在添加s两次,最后一次添加,一次添加。你应该删除第二个。
Distinct().Count() > 1
答案 1 :(得分:0)
如果您需要按升序打印,那么您应首先调用该递归,并且应该首先达到最小的数字。
更新了一个条件中存在错误的代码
public static String evensSquared(String s, int n) {
// I have no idea why this is not working
if (n < 0) {
throw new IllegalArgumentException("Illegal Argument");
}
if (n == 2) {
return "4";
} else if (n % 2 == 0) {
return evensSquared(s, n-1)+" "+n*n;
} else {
return evensSquared(s, n-1);
}
}
答案 2 :(得分:0)
这里的诀窍在于我们被要求以相反的顺序排列两组。在递归中,我们可以将降序与前置和升序相关联。观看(JavaScript代码):
// first the odd numbers squared in
// descending order, followed by the
// even numbers squared in ascending order
function f(n){
if (n == 1)
return '1';
if (n & 1)
return n*n + ' ' + f(n - 1);
return f(n - 1) + ' ' + n*n;
}
console.log(f(8));