⑴ 用c#递归方法算出斐波那契数列第30位是什么数字
static void Main(string[] args)
{
Test2 t = new Test2();
t.math();
}
}
class Test2
{
public void math()
{
int num1 = 1, num2 = 1;
int num = num1 + num2;
Console.WriteLine(" " + num1 + " " + num2 + " " + num);//输出头3个的值 1,1,2
//从第4个值开始循环到第30位
for (int i = 3; i < 30; i++)
{
int num3 = num + num2;
num2 = num;
num = num3;
Console.WriteLine("第{0}位,值:{1}", i + 1, num3);
//输出5个值后换行
if (i % 5 == 0)
{
Console.WriteLine();
}
}
}
⑵ (C#)递归解说
public static int Foo(int i)
{
if (i <= 0)
return 0; // 小于0 的返回0
else if(i > 0 && i <= 2)
return 1; // 前两位数都是1
else return Foo(i -1) + Foo(i - 2); // 从第三位数开始
等于前两位的和,如果i-1位数是第一位或者第二位数就返回1 如果不是继续返回为前两位的和一直到是1为止,然后依次将其后的一个数算出来,最终算到你设置的地方 第30个数字。
我的理解是 调用这个方法运算到这的时候如果需要递归,就再次调用自己,其实你最初调用的方法就一直停在了 else return Foo(i -1) + Foo(i - 2);
这个位置,新调用的方法也是这么算 如果到了这里else return Foo(i -1) + Foo(i - 2); 也是停在这继续再调用这个方法,知道不再调用了,再一步步的返回一个值,直到你第一次调用的地方,就把你要的值求出来了
递归嘛,可以看做第一次到这就停了,这个数再用这个方法去算,一层层的算下去直到出来数字1就是这个方法到不了这,而是直接返回一个数的时候,在一层层的倒退算回去,最终就算到你第一次调用的时候了,也就是30的时候
}
}
i30=i29+i28
i29=i28+i27 i28=i27+i26
i28=i27+i26 i27=i26+i25 i27=i26+i25 i26=i25+i24
....
.....
......
i3=i2+i1=1+1=2 ......
⑶ 看不懂,请解释一下这个常见递归算法。
你这样看 如果i>=3的时候 Foo(i) = Foo(i -1) + Foo(i - 2);
所以
Foo(30)=Foo(29)+Foo(28)
=Foo(28)+F(27) + Foo(27)+Foo(26)
= --------------------------------
每个步骤都调用函数Foo(i)
就这样一直分支下去 到最后全部变成 Foo(0),Foo(1),Foo(2)的相加了,而这3个值已知。所以就得出到案了,当然这是电脑的事,你理解就行
⑷ 一列数的规则如下: 1、1、2、3、5、8、13、21、34...... 求第30位数是多少, 用递归算法实现(C#编写)。
这个就是斐波那契数列。
递归就像递推,跟数学上的递推很相似。
“又一层层代回去,最后加出正确答案”
这句话的意思是,比如算Foo(5)
(a) Foo(5) = Foo(4)+Foo(3)
(b) Foo(4) = Foo(3)+Foo(2)
(c) Foo(3) = Foo(2)+Foo(1) = 1 + 1 = 2;
然后把(c)的结果代入到(b)中,
(b) Foo(4) = Foo(3)+Foo(2) = 2 + 1 = 3
然后把(b)和(c)的结果代入到(a)中,
(a) Foo(5) = Foo(4)+Foo(3) = 3 + 2 = 5
最后得到Foo(5)
两次代入就是所说的一层层代回去
⑸ 一列数的规则如下: 1、1、2、3、5、8、13、21、34求第30位数是多少, 用递归算法实现。答案是这个吗
设这个数列是{a(n)}
就是设a(1)=1;a(2)=1;a(3)=2;a(4)=3;a(5)=5;a(6)=8;...
递推关系是:a(n)=a(n-1)+a(n-2)(n≥3);a(1)=a(2)=1;
也就是说:
a(3)=a(2)+a(1)=1+1=2;
a(4)=a(3)+a(2)=2+1=3;
a(5)=a(4)+a(3)=3+2=5;
...
通项公式是:a(n)=[(1+√5)/2]^n/√5-[(1-√5)/2]^n/√5
然后你把30带进去,就可以啦。
是可以用递归来算。如果你过程没问题,答案就对了。
⑹ 递归算法,计算数组{1,1,2,3,5,8.......} 求第30位值 .明明没有循环为何自动循环
这不是循环,这是递归调用。当调用参数i>2时,就发生递归调用。
⑺ 一列数字的规则如下;1,1,2,3,5,8,13,21,34........ 求第30位数字是多少,用递归算法实现
#include <stdio.h>
#include <stdlib.h>
#define N 30
int main(void)
{
int Fib[N] = {0};
int i;
Fib[0] = 0;
Fib[1] = 1;
for(i = 2; i < N; i++)
Fib[i] = Fib[i-1] + Fib[i-2];
for(i = 0; i < N; i++)
printf("%d ", Fib[i]); printf("\n");
return 0; }
⑻ 列数的规则如下: 1、1、2、3、5、8、13、21、34...... 求第30位数是多少, 用递归算法实现。
这个不是斐波那契数列吗
#include <stdio.h>
int Fibonacci(int n)
{
if( n == 1 || n == 2)
return 1;
else
return Fibonacci(n-1)+Fibonacci(n-2);
}
int main()
{
int n;
printf("please input n: ");
scanf("%d",&n);
printf("Result: %d\n",Fibonacci(n));
return 0;
}
⑼ 一列数的规则如下: 1、1、2、3、5、8、13、21、34...... 求第30位数是多少, 用递归算法实现。
代码如下:
public class Test {
public static void main(String[] args) {
System.out.println("结果是:"+Test.foo(30));
}
/**
* 常见解法
*/
public static int foo(int i){
int a=1,b=1;
int c=0;
for(int k=2;k<i;k++){//注意循环次数
c=a+b;
a=b;//注意这句要放在b=c之前
b=c;
}
return c;
}
}
(9)递归算法c语言求第30位数扩展阅读
递归思想的内涵:
递归就是有去(递去)有回(归来)。“有去”是指:递归问题必须可以分解为若干个规模较小,与原问题形式相同的子问题,这些子问题可以用相同的解题思路来解决,就像上面例子中的钥匙可以打开后面所有门上的锁一样。
“有回”是指 : 这些问题的演化过程是一个从大到小,由近及远的过程,并且会有一个明确的终点(临界点),一旦到达了这个临界点,就不用再往更小、更远的地方走下去。最后,从这个临界点开始,原路返回到原点,原问题解决。
更直接地说,递归的基本思想就是把规模大的问题转化为规模小的相似的子问题来解决。特别地,在函数实现时,因为解决大问题的方法和解决小问题的方法往往是同一个方法,所以就产生了函数调用它自身的情况,这也正是递归的定义所在。
格外重要的是,这个解决问题的函数必须有明确的结束条件,否则就会导致无限递归的情况。
⑽ 面试题递归算法
我来这么解释把 当你激活了程序Foo(30) 。那么根据程序 i=30;即不<=0 也不<=2,那么他就走 Foo(i -1) + Foo(i - 2);
那i-1 跟 i-2 是什么东西的呢,那就是F(29)+F(28);
同理F(29) 怎么拆呢?。。依次照F(30)的方式下去。当遇到F(2)的时候,程序判断 返回一个1,那么最后由N多的1组织一步步返回,最后得到F(30)