我试图在特定位置获取序列的值(序列从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);
}
}
我理解问题存在于我的基本情况中。我该如何解决?
答案 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;
}
得到相同的结果。