幻想森林

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 4041|回复: 11

[通用编程] 递归(已解决)

[复制链接]

313

主题

1574

帖子

1万

积分

⑧专业

*永恒国度*

积分
14145
QQ
发表于 2007-9-26 13:52:53 | 显示全部楼层 |阅读模式
C语言怎么实现用递归方法把  0,1,1,2,3,5,8,13,21,34,55...
给输出来呢?
[img][/img] http://shop33698673.taobao.com被别人嫉妒,证明你优秀,嫉妒别人说明你无能
回复

使用道具 举报

550

主题

9116

帖子

214748万

积分

超级版主

如同神一般的存在,腿神!拖后腿的神~~

Rank: 8Rank: 8

积分
2147483647
发表于 2007-9-26 14:11:01 | 显示全部楼层
这个东西。。。

    for+数组
   
    输入x
    a[0] = 0
        a[1] = 1
    for i in 0..X
           a[x] = a[x-1] + a[x-2]
           print
        end
由于n年没有碰了。。所以写法文完全不记得了。。。。
不知道LZ要的是不是这个?

什么也不懂的我飘走。。。

突然下定决心要学C++
我就是你们的神,庶民们,追随我吧!跟着我一起拖后腿!
回复 支持 反对

使用道具 举报

313

主题

1574

帖子

1万

积分

⑧专业

*永恒国度*

积分
14145
QQ
 楼主| 发表于 2007-9-26 14:15:06 | 显示全部楼层
[s:5] 这样的话就不叫递归吧.......
[img][/img] http://shop33698673.taobao.com被别人嫉妒,证明你优秀,嫉妒别人说明你无能
回复 支持 反对

使用道具 举报

136

主题

1751

帖子

548

积分

版主

Rank: 7Rank: 7Rank: 7

积分
548
发表于 2007-9-26 14:18:14 | 显示全部楼层
这其实是数学问题吧,找出这些数字的规律,下面就好办了。

ps. 数学从来没有及格过的人路过.......
え~え~お!!!
回复 支持 反对

使用道具 举报

313

主题

1574

帖子

1万

积分

⑧专业

*永恒国度*

积分
14145
QQ
 楼主| 发表于 2007-9-26 15:08:26 | 显示全部楼层
规律一看就出来了,问题是现在要用递归方法做出来 [s:6]
[img][/img] http://shop33698673.taobao.com被别人嫉妒,证明你优秀,嫉妒别人说明你无能
回复 支持 反对

使用道具 举报

313

主题

1574

帖子

1万

积分

⑧专业

*永恒国度*

积分
14145
QQ
 楼主| 发表于 2007-9-26 15:20:02 | 显示全部楼层
#include<stdio.h>

int array[10]={0,1};
void arr(int x)
{
     static int a=0;
     if(x>=2)
     {
         array[a+2]=array[a+2-1]+array[a+2-2];
         a++;
         arr(x-1);
     }
   
}
void main()
{
    int i;
    arr(5);
    for(i=0;i<5;i++)
        printf("%d ",array);
}
这样可以了,原来一直没把静态变量的问题处理好,所以搞不出来,现在可以了,谢谢 [s:1]
[img][/img] http://shop33698673.taobao.com被别人嫉妒,证明你优秀,嫉妒别人说明你无能
回复 支持 反对

使用道具 举报

550

主题

9116

帖子

214748万

积分

超级版主

如同神一般的存在,腿神!拖后腿的神~~

Rank: 8Rank: 8

积分
2147483647
发表于 2007-9-26 17:39:57 | 显示全部楼层
难道我给思路的不对。。。。。。

不懂的我不再这丢人了。。。。 [s:5]
我就是你们的神,庶民们,追随我吧!跟着我一起拖后腿!
回复 支持 反对

使用道具 举报

8

主题

215

帖子

2223

积分

⑥精研

积分
2223
发表于 2007-9-26 20:08:37 | 显示全部楼层
fib数列要递归做也没有必要用静态变量,除了那个数组外.如果只是为了输出而没有其它需求的话,那不用数组更好.说到底如果只要求一次fib数列的话最好不要递归,如果要多次求值且范围预先能估计到,那么最有效的方法是程序一开始就算一张表出来,后面运行时查表.

对应LZ的递归算法,应该这样才对:
  1. /*
  2. * fib.c
  3. * 简单递归fibonacci数列算法演示
  4. */
  5. #include <stdio.h>
  6. int array[10] = { 0, 1 };
  7. int fib(int x) {
  8.     switch (x) {
  9.     case 0:
  10.         return 0;
  11.     case 1:
  12.         return 1;
  13.     default:
  14.         array[x] = fib( x - 1 ) + fib( x - 2 );
  15.         return array[x];
  16.         /* basically you should just return the result
  17.           instead of assigning the value into the array
  18.           return fib( x - 1 ) + fib( x - 2 ); */
  19.     }
  20. }
  21. void main() {
  22.     int i;
  23.     fib( 5 );
  24.     for ( i = 0; i < 5; ++i ) {
  25.         printf("%d ", array[i]);
  26.     }
  27. }
复制代码

但实际上这么做效率很低,估计LZ只需要这样就行了:
  1. /*
  2. * fib.c
  3. * 简单循环fibonacci数列算法演示
  4. */
  5. #include <stdio.h>
  6. int array[10] = { 0, 1 };
  7. void fib(int x) {
  8.     int i;
  9.     for ( i = 2; i < x; ++i ) {
  10.         array[ i ] = array[ i - 1] + array[ i - 2];
  11.     }
  12. }
  13. void main() {
  14.     int i;
  15.     fib( 5 );
  16.     for ( i = 0; i < 5; ++i ) {
  17.         printf("%d ", array[i]);
  18.     }
  19. }
复制代码

尾递归是低效的,除非在特定的场景使用递归使语义特别清晰,否则还是避免使用尾递归的好.现代高级语言编译器一般会做尾递归消除的优化,但是不要太依赖这样的优化.
回复 支持 反对

使用道具 举报

8

主题

215

帖子

2223

积分

⑥精研

积分
2223
发表于 2007-10-19 12:35:33 | 显示全部楼层
结果今天上午.NET期末考试的时候考了这数列...真神奇,从大二到大四年年都有它.写了个实现,发在了这里:
http://rednaxelafx.javaeye.com/blog/133377
回复 支持 反对

使用道具 举报

50

主题

742

帖子

402

积分

版主

自定义头衔

Rank: 7Rank: 7Rank: 7

积分
402
发表于 2007-10-19 20:14:53 | 显示全部楼层
这个也是C++众值得骄傲的一个东西偶TOT也给个实现好了:
  1. template<int f>
  2. class FibCalc {
  3. public:
  4.     enum {
  5.         n = FibCalc<f-2>::n + FibCalc<f-1>::n,
  6.     };
  7. };
  8. template<>
  9. class FibCalc<0> {
  10. public:
  11.     enum {
  12.         n = 0,
  13.     };
  14. };
  15. template<>
  16. class FibCalc<1> {
  17. public:
  18.     enum {
  19.         n = 1,
  20.     };
  21. };
  22. // ---------------
  23. #include <stdio.h>
  24. template<int count>
  25. class Printer : private FibCalc<count> {
  26. public:
  27.     Printer(void) { Printer<count-1>(); printf("%d ", n); }
  28. };
  29. template<>
  30. class Printer<0> : private FibCalc<0> {
  31. public:
  32.     Printer(void) { printf("%d ", n); }
  33. };
  34. // ---------------
  35. int main( void ) {
  36. //printf("value is :%d\\n", FibCalc<12>::n);
  37. Printer<12>();
  38. return 0 ;
  39. }
复制代码

编译VS2005已经通过……至于其他未知……
Style-C
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|幻想森林

GMT+8, 2024-5-2 17:09 , Processed in 0.030535 second(s), 21 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表