算法一列数的规则如下 112358132134 求第30位数是多少.docx
《算法一列数的规则如下 112358132134 求第30位数是多少.docx》由会员分享,可在线阅读,更多相关《算法一列数的规则如下 112358132134 求第30位数是多少.docx(16页珍藏版)》请在冰豆网上搜索。
算法一列数的规则如下112358132134求第30位数是多少
算法:
【一列数的规则如下112358132134,求第30位数是多少...
算法:
【一列数的规则如下:
1、1、2、3、5、8、13、21、34,求第30位数是多少,用递归算法实现。
(C#语言)】///<summary>
///一列数的规则如下:
1、1、2、3、5、8、13、21、34求第30位数是多少,用递归算法实现。
(C#语言)
///</summary>
///<paramname="pos"></param>
///<returns></returns>
publicintGetNumberAtPos(intpos)
{
if(pos==0||pos==1)
{
return1;
}
intres=GetNumberAtPos(pos-1)+GetNumberAtPos(pos-2);
returnres;
}usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;namespaceConsoleApplication1{///<summary>///费伯纳契序列算法改进///作者suqifeng///2011-10-2423:
43///</summary>classProgram{publicstaticvoidMain(string[]args){//普通递归算法Console.WriteLine(Fibonacci(40));//改进后递归算法Console.WriteLine(fb(1,1,1,40-2));Console.Read();}///<summary>///普通递归算法--费伯纳契序列///</summary>///<paramname="index">第多少位费伯纳契序列数</param>///<returns></returns>staticintFibonacci(intindex){returnindex<=2?
1:
Fibonacci(index-1)+Fibonacci(index-2);}///<summary>///改进后递归算法--费伯纳契序列///</summary>///<paramname="f">第一位数</param>///<paramname="s">第二数</param>///<paramname="index">第多少位基数从1开始</param>///<paramname="count">第多少位费伯纳契序列数</param>///<returns></returns>publicstaticintfb(intf,ints,intindex,intcount){if(index<=count){returnfb(s,f+s,index+1,count);}returns;}///<summary>///改进后递归算法--费伯纳契序列数求和///</summary>///<paramname="f">第一位数</param>///<paramname="s">第二数</param>///<paramname="index">第多少位基数从1开始</param>///<paramname="count">第多少位费伯纳契序列数</param>///<returns></returns>publicstaticintfbcSum(intf,ints,intindex,intcount){if(index<=count){returnfbcSum(s,f+s,index+1,count);}return(f+s)-2;}}}
递归算法有个问题。
从n-2到3都算了2次。
回复 引用 查看 #2楼[楼主]2007-09-0509:
28jillzhang
@Zeus2
有什么解决办法么?
回复 引用 查看 #3楼2007-09-0509:
31没剑
应该要从第三位开始才递归吧
PrivateFunctiongetPos(ByValposAsInteger)AsInteger
Ifpos<=2ThenReturn1
ReturngetPos(pos-2)+getPos(pos-1)
EndFunction 回复 引用 查看 #4楼[楼主]2007-09-0509:
53jillzhang
@没剑
我的也是从第三位开始的咧 回复 引用 #5楼222.66.167.*2007-09-0510:
08小7[未注册用户]
那道面试题...... 回复 引用 查看 #6楼2007-09-0510:
17D.Oliver
不用递归不是更好吗?
usingSystem;
usingSystem.Collections;
usingSystem.Collections.Generic;
usingSystem.Text;namespaceTest
{
publicclassClass1
{
privateArrayListlist=newArrayList();publicClass1()
{
}publicClass1(intnum)
:
base()
{
inti;for(i=1;i<=num;i++)
{
list.Add(Calculation(i));
}
}privateintCalculation(intnum)
{
if(num==1||num==2)
return1;
else
returnConvert.ToInt32(list[num-2])+Convert.ToInt32(list[num-3]);
}publicintCalculation()
{
returnConvert.ToInt32(list[list.Count-1]);
}
}publicclasstest
{
publicstaticvoidMain()
{
intj;
intnum;
for(j=1;j<100;j++)
{
Console.WriteLine("你要计算第多少位:
");
stringreadstr;
readstr=Console.ReadLine();
if(!
string.IsNullOrEmpty(readstr))
{
if(int.TryParse(readstr,outnum))
{
if(num<1)
continue;
else
{
Class1c1=newClass1(num);
Console.WriteLine(c1.Calculation());
}
}
else
{
continue;
}
}
else
{
break;
}
}
}
}
} 回复 引用 查看 #7楼2007-09-0511:
56没剑
@jillzhang
貌似你的位置还有0的... 回复 引用 查看 #8楼2007-09-0511:
58没剑
老大真牛for(i=1;i<=num;i++)
{
list.Add(Calculation(i));
}
}returnConvert.ToInt32(list[num-2])+Convert.ToInt32(list[num-3]); 回复 引用 查看 #9楼[楼主]2007-09-0512:
05jillzhang
其实这个方法最大的问题在哪?
在于没有验证pos的正负,这样的一个函数是很容易出错的,也是一个正确的函数,在正确使用的情况下是对的,但特殊情况下就异常了,不知道大家看出来没有 回复 引用 查看 #10楼2007-09-0512:
11没剑
PrivateFunctiongetPos(ByValposAsInteger)AsInteger
Ifpos<=2ThenReturn1
ReturngetPos(pos-2)+getPos(pos-1)
EndFunction
我的完成没有这个问题 回复 引用 查看 #11楼2007-09-3008:
56麒麟.NET
Fibonacci数列啊 回复 引用 查看 #12楼2007-11-0610:
421-2-3
好像有一种用公式来计算的方法,公式好像挺复杂的,好像在网上见过一次。
回复 引用 #13楼220.181.47.*2007-11-2517:
27possible[未注册用户]
publicintGetNumber(intindex)//index从1开始
{
inta1=1,
inta2=1,
inttemp;
intcount=3
while(index>=count)
{
temp=a2;
a2=a1+a2
a1=temp
count++
}
returna2;
} 回复 引用 #14楼218.28.144.*2007-12-2114:
50小耿[未注册用户]
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;namespaceConsoleApplication3
{
classA
{
publicintGetNumberAtPos(intpos)
{
if(pos==0||pos==1)
{
return1;
}
intres=GetNumberAtPos(pos-1)+GetNumberAtPos(pos-2);
returnres;
}
}
classProgram
{staticvoidMain(string[]args)
{
An=newA();Console.WriteLine(n.GetNumberAtPos(29));
Console.ReadLine();
//inti=1;
//while(i<4)
//{//}}
}
} 回复 引用 #15楼220.163.56.*2007-12-2622:
15NetCare[未注册用户]
inta1=1,a2=1,returnValue;
for(inti=2;i<num;i++)
{
returnValue=a2;
a2+=a1;
a1=returnValue;
}
returna1; 回复 引用 #16楼219.131.199.*2008-02-0514:
37imetgong[未注册用户]
publicintgetNumber(intpos){
if(pos<1){
return-1;
}if(pos<3){
return1;
}while(pos>0){
returngetNumber(pos-2)+getNumber(pos-1);
}return-1;
} 回复 引用 查看 #17楼2008-07-2916:
22shawnliu
代码效率太差了把
只需要用两个变量保存前两位不就行了再加一个当前数值,
最后更新一下变量 回复 引用 查看 #18楼2008-07-3114:
23丛林之王
楼主这个貌似应该这样
publicintGetNumberAtPos(intpos)
{
if(pos==0||pos==-1)
{
return0;
}
if(pos==1)
{
return1;
}
intres=GetNumberAtPos(pos-1)+GetNumberAtPos(pos-2);
returnres;
} 回复 引用 #19楼222.89.91.*2008-11-2508:
23哲思[未注册用户]
支持13楼的
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;namespace算法设计_一列数
{
classProgram
{
staticvoidMain(string[]args)
{DateTimetime2=DateTime.Now;
Console.WriteLine(time2.ToString());
intnumber2=GetNumber(30);
DateTimetime3=DateTime.Now;
Console.WriteLine(time3.ToString());
TimeSpant2=time3.Subtract(time2);
Console.WriteLine(t2.ToString());
Console.WriteLine(number2);
DateTimetime=DateTime.Now;
Console.WriteLine(time.ToString());
intnumber=getNumber(30);
DateTimetime1=DateTime.Now;
Console.WriteLine(time1.ToString());
TimeSpant1=time1.Subtract(time);
Console.WriteLine(t1.ToString());
Console.WriteLine(number);}publicstaticintgetNumber(intpos)
{
if(pos==0||pos==1)
{
return1;}
ints=getNumber(pos-1)+getNumber(pos-2);
returns;}
publicstaticintGetNumber(intindex)//index从1开始
{
inta1=1;
inta2=1;
inttemp;
intcount=2;
while(index>=count)
{
temp=a2;
a2=a1+a2;
a1=temp;
count++;
}
returna2;
}}
}
执行以后就可以看出差别了
数值的索引越往后差别越明显!
回复 引用 #20楼218.64.57.*2009-03-1610:
09test111111111111111[未注册用户]
intfwdadd(inti)
{
ints,m,n,flag;
if(i<3)
return1;
else
{
m=1;n=1;flag=0;s=1;
for(intk=3;k<=i;k++)
{
flag=1-flag;
if(flag)
m=m+n;
else
n=n+m;}
if(flag)
returnm;
else
returnn;
}
} 回复 引用 查看 #21楼2009-05-2613:
44Funeral
不用递归也能很简单的intfibonacci=0;
for(inti=0,j=0,k=1,fib=1;i<30;fib=j+k,j=k,k=fib,i++)
{
fibonacci=fib;
}
Console.WriteLine(fibonacci);
Console.Read(); 回复 引用 #22楼119.147.107.*2009-07-0800:
46liubaiwu[未注册用户]
privateintadd(intf,ints,intindex)
{
intresult=f+s;
if(index<=30)
{
returnadd(s,result,index+1);
}
returnresult;
}
这样的解决方法 回复 引用 查看 #23楼2011-10-2423:
51长沙-C#山高我为峰ViewCode1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Text;
namespaceConsoleApplication1
{
///<summary>
///费伯纳契序列算法改进
///作者suqifeng
///2011-10-2423:
43
///</summary>
classProgram
{
publicstaticvoidMain(string[]args)
{
//普通递归算法
Console.WriteLine(Fibonacci(40));
//改进后递归算法
Console.WriteLine(fb(1,1,1,40-2));
Console.Read();
}
///<summary>
///普通递归算法--费伯纳契序列
///</summary>
///<paramname="index">第多少位费伯纳契序列数</param>
///<returns></returns>
staticintFibonacci(intindex)
{
returnindex<=2?
1:
Fibonacci(index-1)+Fibonacci(index-2);
}
///<summary>
///改进后递归算法--费伯纳契序列
///</summary>
///<paramname="f">第一位数</param>
///<paramname="s">第二数</param>
///<paramname="index">第多少位基数从1开始</param>
///<paramname="count">第多少位费伯纳契序列数</param>
///<returns></returns>
publicstaticintfb(intf,ints,intindex,intcount)
{
if(index<=count)
{
returnfb(s,f+s,index+1,count);
}
returns;
}
///<summary>
///改进后递归算法--费伯纳契序列数求和
///</summary>
///<paramname="f">第一位数</param>
///<paramname="s">第二数</param>
///<paramname="index">第多少位基数从1开始</param>
///<paramname="count">第多少位费伯纳契序列数</param>
///<returns></returns>
publicstaticintfbcSum(intf,ints,intindex,intcount)
{
if(index<=count)
{
returnfbcSum(s,f+s,index+1,count);
}
return(f+s)-2;
}
}
} 回复 引用 查看 #24楼2012-03-2014:
07不死鸟一灰1
2
3
4
5
privatestaticintSum(intnum)
{
if(num<3)return1;
returnSum(num-1)+