Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.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 用递归求级数_Java_Recursion - Fatal编程技术网

Java 用递归求级数

Java 用递归求级数,java,recursion,Java,Recursion,如果n为3,我尝试使用递归打印122333221。但我无法解决它。我们已经给出了使用递归打印序列所需的数字。例如,如果n=3,则应打印122333221 public static void print(int n){ if(n < 1 ){ return; } print(n-1); for(int i = 1; i <= n; i++){ System.out.print(n); } } public static void main(String[] args

如果n为3,我尝试使用递归打印122333221。但我无法解决它。我们已经给出了使用递归打印序列所需的数字。例如,如果n=3,则应打印122333221

public static void print(int n){
if(n < 1 ){
  return;
}

print(n-1);
for(int i = 1; i <= n; i++){
    System.out.print(n);
}

}

public static void main(String[] args) {
print(3);

}
公共静态无效打印(int n){
if(n<1){
返回;
}
打印(n-1);

对于(int i=1;i一个可能的解决方案是n是您拥有的不同位数,而您需要打印每个位数乘以其值,因此如果n=1

结果=1

n=2结果1221

n=3,结果122333221

n=4,结果12233344333221

实现并不困难,基本情况是数字=n,打印n次,您总是递归打印,除非您达到n,否则第一次调用总是

solve(n, 1,1);
实施:

public void solve(int n, int numberOfPrints, int  num) {

if(numberOfPrints == 0 && n ==num )
return ;
if(numberOfPrints == 0 )
   solve(n, num+1,num+1);

System.out.print(num);
solve(n, numberOfPrints-1, num);
if(num == n)
return;
System.out.print(num);
}
publicstaticvoidprintseries(intseriesnum、intcurrentnum、boolmovingforward)
{
if(向前移动(¤tNum0)
{
PrintNum(currentNum);
}
如果(currentNum-1>0)
{
PrintSeries(seriesNum,currentNum-1,false);
}
}
}
公共静态void PrintNum(int num)
{
对于(int x=0;x
您必须使用通过参数跟踪您的状态的常规技术,方法是定义一个
public
方法,该方法使用带有额外参数的
private
方法

// Repeats n n times.
private static void repeat(int n) {
    for (int i = 0; i < n; i++) {
        System.out.print(n);
    }
}

private static void print(int n, int v) {
    if (n == v) {
        // Just once for the deepest level.
        repeat(n);
    } else {
        // Wrap the inner print ...
        repeat(n);
        // Recurse with the next higher value.
        print(n + 1, v);
        // ... end the wrap.
        repeat(n);
    }
}

public static void print(int n) {
    System.out.print(n+": ");
    print(1, n);
    System.out.println();
}

public void test(String[] args) {
    for (int i = 1; i <= 9 ; i++) {
        print(i);
    }
}
//重复n次。
专用静态无效重复(int n){
对于(int i=0;i对于(int i=1;我似乎是抓起笔和纸写下您希望函数的每次递归调用做什么的好时机。函数的当前定义有问题。是的。对于4,它应该打印12233344333221很好的解决方案。我认为
if(n>v)return;
是reduntant.@OldeCurmudgeon,不要看到任何奇怪的东西。
n==v
是基本情况。
n>v
无论如何都不会为真。PrintSeries是递归函数,seriesNum参数是“n”,或系列的最大编号,currentNum是当前要打印的编号,boolean movingForward会提醒函数是否要检查以终止递归。为了减少重复代码,我创建了另一个名为PrintNum的空函数,它使用int类型的参数,它会执行一个for循环,该循环打印等于自身的编号。@notyou,这是一个足够好的解释吗?
// Repeats n n times.
private static void repeat(int n) {
    for (int i = 0; i < n; i++) {
        System.out.print(n);
    }
}

private static void print(int n, int v) {
    if (n == v) {
        // Just once for the deepest level.
        repeat(n);
    } else {
        // Wrap the inner print ...
        repeat(n);
        // Recurse with the next higher value.
        print(n + 1, v);
        // ... end the wrap.
        repeat(n);
    }
}

public static void print(int n) {
    System.out.print(n+": ");
    print(1, n);
    System.out.println();
}

public void test(String[] args) {
    for (int i = 1; i <= 9 ; i++) {
        print(i);
    }
}