f(0)=0,f(1)=0,...f(k-2)=0,f(k-1)=1;f(n)=f(n-1)+f(n-2)+........+f(n-k),n=k,k+1,....
请用java编写出算法
请用java编写出算法
解决方案 »
- hibernate 标注 中外键的问题
- 如何将text设置为*
- 我想做一个加法的界面,但点击等于号就会报错,为什么呢?请各位高手帮我看看~
- java如何实现语音,视频聊天,飞鸽传书文件传输
- 如何按不同顺序 共N!次 来遍历数组N?谢谢
- 我把JTextArea放入JScrollPane中实现垂直滚动功能,但是为什么每次滚动的时候,滚动条总是在上方?如何调整使滚动条再下方啊
- 吐血的菜鸟问题(小弟实在是菜鸟级,还望各位高手不吝赐教)
- 用JDK1.4需设环境变量吗?
- Reduction of the Shift opeartor's right operand ??
- 再次提问关于类的问题;
- JScrollPane 滚动条无法滚动的问题
- Jboss如何启动一个普通的Java类
public class TestApplet{
public static int returnSum(int i){
int sum = 0;
if (i<0)
return -1;
else if (i == 2)
sum = 1;
else if(i>2)
sum = returnSum(i-1) +returnSum(i-2);
return sum; }
public static void main(String args[]){
for (int i=0; i<10; i++)
System.out.println(returnSum(i));
}
}
输出:
0
0
1
1
2
3
5
8
13
21
public static int fib(int n) {
if (n < 2) {
return n;
}
else {
return fib(n-1)+fib(n-2);
}
}
}
循环算法:public class FibonacciIterative {
public static int fib(int n) {
int prev1=0, prev2=1;
for(int i=0; i<n; i++) {
int savePrev1 = prev1;
prev1 = prev2;
prev2 = savePrev1 + prev2;
}
return prev1;
}
}
不仅仅是 f(0)和f(1)为0
这要看K
0~k-2都是 0 k-1为1
这样再用递归的方式求出k 之后是k+1这样算法需要改下
在此谢谢大家,请高手给出正解,我会一直关注
f(n)=f(n-1)+f(n-2)+........+f(n-k),n=k,k+1,.... 这个方法#3也没有实现啊
自己顶下 希望高手给解决
f = new int[n + 1];for (int i = 0; i < k - 1; ++i) f[i] = sum[i] = 0;
f[k - 1] = sum[k - 1] = 1;for (int i = k; i <= n; ++i) {
f[i] = sum[i - 1] - (i - k - 1 < 0 ? 0 : sum[i - k - 1]);
sum[i] = sum[i - 1] + f[i];
}
f(0)=0,f(1)=0,...f(k-2)=0,f(k-1)=1;f(n)=f(n-1)+f(n-2)+........+f(n-k),n=k,k+1,....,
试编写求k阶斐波那契序列的第m项值得函数算法,k和m均以值调用的形式在函数参数表中出现(貌似和我一开始给的差不多啊,呵呵)
关注中!!!!!!!
正确的做法是采用非递归算法。只是这个题目比较特殊,可以用简单的循环实现。#4楼中的循环算法不错。
如果想求出所有的值,可以如下大概的主体:if (n < 2) return 0;
int f = new int[n + 1];
f[0] = 1;
f[1] = 1;
for (int i = 2; i <= n; ++ i)
{
f[i] = f[i-2] + f[i - 1];
}
return f[n];
public static void main(String[] args) {
System.out.println(compute(9));
} private static long compute(int i) {
if (i == 0 || i == 1) {
return i;
} else {
return compute(i - 1) + compute(i - 2);
}
}
先给你递归的吧,非递归的还得研究一下:public class KLevelFibo {
public static int get(int k, int m) {
if (m < k-1) return 0;
else if (m == k-1) return 1;
else {
int result = 0;
for (int i = m-k; i < m; i++)
result += get(k, i);
return result;
}
} public static void main(String[] args) {
System.out.println(KLevelFibo.get(3, 10));
}}
结贴的时候会给你的,我也是很friendly的人,交个朋友吗,积分是次要的
public static int get(int k, int m) {
if (m < k-1) return 0;
else if (m == k-1) return 1;
else {
int[] prevs = new int[m+1];
prevs[k-1] = 1;
for (int i = k; i < m+1; i++) {
int cur = 0;
for (int j = i-k; j < i; j++)
cur += prevs[j];
prevs[i] = cur;
}
return prevs[m];
}
}
试编写求k阶斐波那契序列的第m项值得函数算法,k和m均以值调用的形式在函数参数表中出现
分析:可分为3个阶段:
1.0<=m<=k-2 f(m)=0;
2.m=k-1 f(m)=1;
3.m>k-1 用数学归纳法解f(n)=f(n-1)+f(n-2)+........+f(n-k),n=k,k+1,....,
当n=k时 f(m)=f(k)=1;
当n=k+1是 f(m)=f(k+1)=f(k)+f(k-1)+0=f(m-1)+f(m-2)
........
可以看出我们可以把f(n)=f(n-1)+f(n-2)+........+f(n-k),n=k,k+1,...., 看成是首项f(k)=1,f(k+1)=2,第m项 f(m)=f(m-1)+f(m-2),
于是可以用我们常见的k阶斐波那契序列求m项来求解
代码:
package file;import java.util.Scanner;public class structer {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int k = sc.nextInt();
int m = sc.nextInt();
int f[]=new int[10];
if(m>=0&&m<=k-2){
for(int i:f){
i=0;}
}
if(m==k-1){
f[m]=1;
}
else{
for(m=k;m<f.length;m++){
f[k]=1;
f[k+1]=2;
f[m]=f[m-1]+f[m-2];
}
}
for(int j:f ){
System.out.println(j);
}
}
}
结贴时间延长,以上代码供大家讨论。。
public class Test { public static void main(String[] args) {
long n = fibonacci(40);
System.out.println("F(40) = " + n);
}
public static long fibonacci(int month) {
if(month < 1) {
return 0;
}
double sqrt5 = Math.sqrt(5);
double a = Math.pow((1 + sqrt5) / 2, month);
double b = Math.pow((1 - sqrt5) / 2, month);
double r = (sqrt5 / 5) * (a - b);
return Math.round(r);
}
}
n=k+2,f(m)=f(k+2)=f(k+1)+f(k)+f(k-1);等于三项...还是失望了