用递归和加法计算数字的幂

时间:2018-01-01 21:22:03

标签: java recursion

我必须通过递归计算X到Y的幂,只有加法。如果不使用循环或使用乘法,我真的无法弄清楚如何做到这一点。这不是我的功课。这是我去年考试的问题。

import java.util.Scanner;

public class Season4Task7 {

    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        System.out.println("Enter X");
        int x = sc.nextInt();
        System.out.println("Enter y");
        int y = sc.nextInt();

        System.out.println(findXY(x, y, 0));
    }
    static int findXY(int x, int y, int result){
        if(y==0){
            return 1;
        }
        if(x==0){
            return 0;
        }
        if(y==1){
            return result+x;
        }
        result+=x;

        return findXY(x, y-1, result);
    }
}

前两个ifs看起来很好,也许是'y-1',但之后它可能是不正确的,也有可能不使用'int result'而只是将x和y传递给函数?< / p>

2 个答案:

答案 0 :(得分:1)

你的findXY方法真正做的是简单的乘法,而不是取幂。首先,它可以从使用3个参数改进到仅2:

static int findXY(int x, int y){
    if(y==0){
        return 1;
    }
    if(x==0){
        return 0;
    }
    if(y==1){
        return x;
    }

    return x + findXY(x, y-1);
}

其次,你已经完成了一半!你刚刚找到了一种只使用加法和递归的方法。你现在需要做的是,再次使用递归将这个乘法调用一定数量。

在开始之前,让我们将方法从findXY重命名为multiply,因为它更能说明其意图和功能。

第三,我们需要实现计算功率的方法。请记住,我们将您的findXY方法重命名为multiply并将参数数量从3更改为2,我们的实现可能如下所示:

static int power(int x, int y) {
    if(y == 0) {
        return 1;
    }
    if(y == 1) {
        return x;
    }
    return x * power(x, y-1));
}

嘿,但我们允许使用乘法!幸运的是,我们自己实现了!最终产品如下所示:

static int power(int x, int y) {
    if(y == 0) {
        return 1;
    }
    if(y == 1) {
        return x;
    }
    return multiply(x, power(x, y-1));
}

请注意,此方法不适用于负数。如果是这种情况,您可以将此方法包装在另一个方法中,只需调用power abs值并反转结果

答案 1 :(得分:0)

由于我们不能使用乘法,我们需要使用递归加法。检查下面的代码。如果条件正确,你的前三个。将以后的代码修改为以下方法。

package com.java;

import java.util.Scanner;

public class Season4Task7 {

    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);

        System.out.println("Enter X");

        int x = sc.nextInt();

        System.out.println("Enter y");

        int y = sc.nextInt();

        System.out.println("Final :: " + findXPowerY(x, y));

        sc.close();
    }

    static int findXPowerY(int x, int y) {

        if (y == 0) {
            return 1;
        }
        if (x == 0) {
            return 0;
        }
        if (y == 1) {
            return x;
        }

        return multiply(x, findXPowerY(x, y - 1));
    }

    static int multiply(int x, int y) {
        if (y != 0)
            return (x + multiply(x, y - 1));
        else
            return 0;
    }
}