使用递归打印最大N的平方,然后是平方的平方

时间:2018-04-18 09:01:19

标签: java recursion

我必须使用递归打印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);
    }
}

3 个答案:

答案 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));