Java 使用带递归的for循环

Java 使用带递归的for循环,java,Java,因此,我试图打印出递归指数方法的实际过程,然后是最终的值,但是我的for循环有问题。例如,如果用户输入4到4次方,它应该打印出4到4,4到3,4到2,等等,然后打印出正确的4到4次方的值,但最终我得到的值是0 import java.util.Scanner; public class Recursion { public static void main(String[] args) { Scanner input = new Scanner(System.in);

因此,我试图打印出递归指数方法的实际过程,然后是最终的值,但是我的for循环有问题。例如,如果用户输入4到4次方,它应该打印出4到4,4到3,4到2,等等,然后打印出正确的4到4次方的值,但最终我得到的值是0

import java.util.Scanner; 

public class Recursion
{
  public static void main(String[] args)
  {
    Scanner input = new Scanner(System.in);

    System.out.println("Enter base: ");
    int baseNum = input.nextInt();

    System.out.println("Enter exponent: ");
    int expNum = input.nextInt();

    for(int i = 1; i <= baseNum; ++i)
    {

    System.out.printf("\n%d to the %d", baseNum, expNum--);

    }

    System.out.printf("\nValue is %d",power(baseNum, expNum));
  }



  public static int power(int base, int exponent)
  {
    if(base == 0)
      return 1;

    else
      return exponent * power(base - 1, exponent);
  }
}
import java.util.Scanner;
公共类递归
{
公共静态void main(字符串[]args)
{
扫描仪输入=新扫描仪(System.in);
System.out.println(“输入基:”;
int baseNum=input.nextInt();
System.out.println(“输入指数:”);
int expNum=input.nextInt();

对于(int i=1;i,幂运算的递归定义是

x^n = x * x^(n-1)

请注意,指数减少,而不是基数。

指数化的递归定义是

x^n = x * x^(n-1)

请注意,指数减小,而不是基数。

您将基数与指数混淆。幂法的定义如下:

public static int power(int base, int exponent) {
    if(exponent == 0) {
        System.out.println(1); // for display
        return 1;
    }
    else {
        int rem = power(base, exponent-1);
        if (rem > 1) {
            System.out.println(rem); // for display
        }
        return base * rem;
    }
}
用法

public static void main(String[] args) {
    System.out.println(power(4,2)); // prints 16
}

你把基数和指数搞混了。幂法的定义如下:

public static int power(int base, int exponent) {
    if(exponent == 0) {
        System.out.println(1); // for display
        return 1;
    }
    else {
        int rem = power(base, exponent-1);
        if (rem > 1) {
            System.out.println(rem); // for display
        }
        return base * rem;
    }
}
用法

public static void main(String[] args) {
    System.out.println(power(4,2)); // prints 16
}

幂=基数提升到指数。你做得不对。正确的方法-

public static int power(int base, int exponent) {
    if(exponent == 0)
        return 1;
    else
        return base * power(base, exponent-1);
}
要使上述代码显示中间结果:

import java.util.Scanner;

public class Recursion {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);

        System.out.println("Enter base: ");
        int baseNum = input.nextInt();

        System.out.println("Enter exponent: ");
        int expNum = input.nextInt();

        int pow = power(baseNum, expNum);

    }

public static int power(int base, int exponent) {

    int pow = 0;

    if (exponent == 0) {
        pow = 1;
        System.out.println(base + " raised to " + exponent + " is " + pow);
    } else {

        pow = base * power(base, exponent - 1);
        System.out.println(base + " raised to " + exponent + " is " + pow);
    }

    return pow;

}

幂=基数提升到指数。你做得不对。正确的方法-

public static int power(int base, int exponent) {
    if(exponent == 0)
        return 1;
    else
        return base * power(base, exponent-1);
}
要使上述代码显示中间结果:

import java.util.Scanner;

public class Recursion {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);

        System.out.println("Enter base: ");
        int baseNum = input.nextInt();

        System.out.println("Enter exponent: ");
        int expNum = input.nextInt();

        int pow = power(baseNum, expNum);

    }

public static int power(int base, int exponent) {

    int pow = 0;

    if (exponent == 0) {
        pow = 1;
        System.out.println(base + " raised to " + exponent + " is " + pow);
    } else {

        pow = base * power(base, exponent - 1);
        System.out.println(base + " raised to " + exponent + " is " + pow);
    }

    return pow;

}

您的代码有两个问题

  • 指数在您实际使用它之前发生了变异
  • 幂()中反转基数和指数
  • 下面是代码的编辑版本,可以正常工作

    import java.util.Scanner;
    
    public class Recursion
    {
    
        public static void main(String[] args)
        {
            Scanner input = new Scanner(System.in);
    
            System.out.println("Enter base: ");
            int baseNum = input.nextInt();
    
            System.out.println("Enter exponent: ");
            int expNum = input.nextInt();
    
            for (int i = 1; i <= expNum; ++i)
            {
    
                System.out.printf("\n%d to the %d", baseNum, i);
    
            }
    
            System.out.printf("\nValue is %d", power(baseNum, expNum));
        }
    
        public static int power(int base, int exponent)
        {
            if (exponent == 0)
            {
                return 1;
            }
    
            else
            {
                return base * power(base, exponent - 1);
            }
        }
    }
    
    import java.util.Scanner;
    公共类递归
    {
    公共静态void main(字符串[]args)
    {
    扫描仪输入=新扫描仪(System.in);
    System.out.println(“输入基:”;
    int baseNum=input.nextInt();
    System.out.println(“输入指数:”);
    int expNum=input.nextInt();
    
    对于(inti=1;i,您的代码有两个问题

  • 指数在您实际使用它之前发生了变异
  • 幂()中反转基数和指数
  • 下面是代码的编辑版本,可以正常工作

    import java.util.Scanner;
    
    public class Recursion
    {
    
        public static void main(String[] args)
        {
            Scanner input = new Scanner(System.in);
    
            System.out.println("Enter base: ");
            int baseNum = input.nextInt();
    
            System.out.println("Enter exponent: ");
            int expNum = input.nextInt();
    
            for (int i = 1; i <= expNum; ++i)
            {
    
                System.out.printf("\n%d to the %d", baseNum, i);
    
            }
    
            System.out.printf("\nValue is %d", power(baseNum, expNum));
        }
    
        public static int power(int base, int exponent)
        {
            if (exponent == 0)
            {
                return 1;
            }
    
            else
            {
                return base * power(base, exponent - 1);
            }
        }
    }
    
    import java.util.Scanner;
    公共类递归
    {
    公共静态void main(字符串[]args)
    {
    扫描仪输入=新扫描仪(System.in);
    System.out.println(“输入基:”;
    int baseNum=input.nextInt();
    System.out.println(“输入指数:”);
    int expNum=input.nextInt();
    
    for(int i=1;i)你应该从指数中减去一,而不是基数。当你在for循环后调用power()时,expNum不是它开始时的值。是的,我看到了,但是我如何改变它,并向用户显示发生了什么。你应该从指数中减去一,而不是基数。当你调用power()时在for循环之后,expNum不是它开始时的值是的,我看到了,但是我如何改变它,并向用户显示正在发生的事情。我认为我的方法不适用,但当我没有使用for循环时,它给了我正确的值。当我在for循环中打印它时,就像我在代码中一样,该值不起作用。我需要向用户显示它到底是什么oing.@user3772253当然“不起作用”:for循环调用
    power()
    ,计算值,然后在循环中运行另一个迭代,使用不同的值调用
    power()
    。如果要“向用户显示计算的阶段”,应该打印
    power(基数,指数-1)的值
    else
    部分中,在
    返回之前
    @user3772253查看新编辑,它将显示所有“阶段”在计算过程中,我认为我的方法有问题,但当我没有使用for循环时,它给了我正确的值。当我在for循环中打印它时,就像我在代码中一样,该值不起作用。我需要向用户显示它到底在做什么。@user3772253当然它“不起作用”:for循环调用
    power()
    计算值,然后在循环中运行另一个迭代,该循环使用不同的值调用
    power()
    。如果要“向用户显示计算阶段”,应打印
    power(基数,指数-1)的值
    else
    部分中,在
    返回之前
    @user3772253查看新编辑,它将显示所有“阶段”在计算中,这一切都是有意义的,谢谢你。但是,输出应该是反转的。为什么,我不知道,但是像5到5,5到4,5到3等等。当我反转++I,到-,我的输出一直在继续,所以我试图反转它。如果可能的话,如果没有,那就这样吧。我更清楚地理解它,所以我很高兴将++i反转为--i是指for循环从i=1开始,只有当它违反停止条件“i=1;--i”时才会停止这一切都是有道理的,谢谢你。但是,输出应该是反向的。为什么,我不知道,但是像5到5,5到4,5到3等等。当我反向++时,我,到-,我的输出一直在继续,所以我试图反向。如果可能的话,如果不可能的话,那就这样吧。我更清楚地理解它,所以我很高兴。反向++的问题我想--i表示for循环从i=1开始,只有当它违反停止条件“i=1;--i”时才会停止