特定序列的递归方法

时间:2015-10-07 20:22:23

标签: java recursion sequence

我试图在特定位置获取序列的值(序列从0开始)。此序列的公式为f(n) = (2^n) - 1,其中f(0) = 0

序列为f(0) = 0, f(1) = 1, f(2) = 3, f(3) = 7, f(4) = 15等等......

我写了这个递归函数来找到位置。但是,我的数字有点偏。为什么我的号码关闭?

对于此结果,如果我输入数字f(4),我会得到f(5) -- 31中的值。

public static int getNumber(int num) {
    if(num == 0) {
        return 1;
    } else {
        return (int)Math.pow(2,num) + getNumber(num-1);
    }
}

我理解问题存在于我的基本情况中。我该如何解决?

2 个答案:

答案 0 :(得分:1)

你说f(0)= 0,但你的代码检查num == 0是否为num == 0,如果是,则返回1.如果Math.pow(2, num - 1),你只需要返回0。

虽然我不认为你的递归会按照你想要的方式正常工作。 2 ^ n - 1可以表示为2 less 的所有幂的总和,而你的总和小于或等于n的2的幂。所以你应该在def input_grade(assignment): while True: try: grade = input("What grade did you receive on: %s? " % assignment) grade = float(grade) if grade < 0 or grade > 1000: raise ValueError return grade except: print("Sorry, that's an invalid input. Please only use numbers and decimal points!") for assignment in Assignments: Assignments[assignment].append(input_grade(assignment)) 的时候接受它。

答案 1 :(得分:1)

您的说明f(0)0。此外,您的功能不会被记录。我想你想要2 n - 1喜欢

public static int getNumber(int num) {
    if (num == 0) {
        return 0;
    }
    return (int) (Math.pow(2, num) - 1);
}

我测试过它,

public static void main(String[] args) {
    for (int i = 0; i < 10; i++) {
        System.out.printf("f(%d) = %d%n", i, getNumber(i));
    }
}

获得了预期的结果。当然,您可以使用bitshift而不是Math.pow(因为它是2)。像,

public static int getNumber(int num) {
    if (num == 0) {
        return 0;
    }
    return (1 << num) - 1;
}

得到相同的结果。