Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用递归打印赔率为N的平方,然后打印偶数的平方_Java_Recursion - Fatal编程技术网

Java 使用递归打印赔率为N的平方,然后打印偶数的平方

Java 使用递归打印赔率为N的平方,然后打印偶数的平方,java,recursion,Java,Recursion,我必须使用递归打印n的平方,我必须先打印降序的奇数平方,然后是升序的偶数平方 奇数排序代码有效,而偶数排序代码无效 我将问题分为两种方法,然后将其合并为一种方法,第一种方法将按降序打印奇数平方,然后第二种“应”按升序打印偶数平方: 给你: public static String printSquares(int n) { // Prints out the squares to n // Odd numbers first in descending order //

我必须使用递归打印n的平方,我必须先打印降序的奇数平方,然后是升序的偶数平方

奇数排序代码有效,而偶数排序代码无效

我将问题分为两种方法,然后将其合并为一种方法,第一种方法将按降序打印奇数平方,然后第二种“应”按升序打印偶数平方:

给你:

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);
    }
}
公共静态字符串printSquares(int n){
//将正方形打印到n
//奇数以降序排列
//偶数按升序排列
返回oddsquared(n)+evensSquared(“,n”);
}
公共静态字符串evensSquared(字符串s,int n){
//我不知道这为什么不起作用
if(n<0){
抛出新的IllegalArgumentException(“非法参数”);
}
如果(n==2){
返回2*2+“”+s;
}否则如果(n%2==0){
s=n*n+“”+s;
返回s+均匀平方(s,n-);
}否则{
回归平差平方(s,n-);
}
}
公共静态字符串oddsSquared(int n){
if(n<0){
抛出新的IllegalArgumentException(“非法参数”);
}
如果(n==1){
返回1+“”;
}否则如果(n%2!=0){
返回n*n+“”+oddsSquared(n-1);
}否则{
返回oddsSquared(n-1);
}
}

您的第一个问题是使用
n--

在奇数代码中,使用
n-1
调用函数内部的函数,实际上返回
n-1
(我知道这很明显)。例如,如果
n=5
,则
n-1
返回
4

但是在偶数的代码中,您使用
n--
调用函数内部的函数,该函数不返回
n-1
,而是
n
。(这就是棘手的地方)<代码>n--返回
n
然后应用负1。因此,如果您有
n=5
,那么
n--
将返回5

您可以使用
--n
,在返回它之前先将-1应用于
n
,也可以使用不会混淆的
n-1
,以避免错误


第二个问题是:

s = n * n +" "+ s;
return s + evensSquared(s, n--);
您要添加两次s,一次在末尾,一次在开头。您应该删除第二个

s = n * n +" "+ s;
return evensSquared(s, n--);

如果需要按升序打印,则应首先调用rescursion,并应首先到达最低的数字

更新了代码有一个条件出现了错误

 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);
    }
}
公共静态字符串evensSquared(字符串s,int n){
//我不知道这为什么不起作用
if(n<0){
抛出新的IllegalArgumentException(“非法参数”);
}
如果(n==2){
返回“4”;
}否则如果(n%2==0){
返回均匀度平方(s,n-1)+''+n*n;
}否则{
返回均匀度平方(s,n-1);
}
}

这里的诀窍是我们被要求按相反的顺序分两组。在递归中,我们可以将降序与前置相关联,升序与追加相关联。监视(JavaScript代码):

//首先是奇数的平方
//降序,然后是
//按升序平方的偶数
函数f(n){
如果(n==1)
返回“1”;
如果(n&1)
返回n*n+''+f(n-1);
返回f(n-1)+''+n*n;
}

控制台日志(f(8))您缺少实际问题和任何解释。你不能像那样卸载代码,大多数人无论如何都不会运行它。你能添加一个例子,说明什么是输入,什么是预期输出,以及你的输出是什么吗?它像
printSquares(5)
应该返回
25,9,1,16,4
?你的算法的输出是什么?您是否尝试过一些示例结果,如4或5?你应该让日志记录者看看你的代码进展如何,如果你使用的是IDE,甚至是一个调试器。当我们谈论Java时,为什么要用javascript回答呢?@vincrichaud因为函数非常简单,可以转换,很容易在堆栈溢出网页上演示,我使用的是电话,所以我没有访问IDE,而且我不精通Java,因此我必须花一些时间进行实验,以确保代码是正确的:)