递归 一个简单的程序 谢谢

zhulinjia 2009-03-13 06:06:23
int F(int n)       //以 F(5) 为例
{
if( n > 1 )
{
F(n - 1) ;
F(n - 1) ;
}
return 1;
}


递归排序中也有个类似的函数 。这些函数有什么公式 或 规律 ?
...全文
209 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhulinjia 2009-03-14
  • 打赏
  • 举报
回复
可能是我问的不太清楚。 这分大家平分了算了
h13826013646 2009-03-13
  • 打赏
  • 举报
回复
学习了
maimang09 2009-03-13
  • 打赏
  • 举报
回复
递归就是把问题简单化。把大量的运算交给计算机去做
fairchild811 2009-03-13
  • 打赏
  • 举报
回复
晕了.楼主意思不明确

不过2楼讲的很清晰.up
senleng 2009-03-13
  • 打赏
  • 举报
回复
递归递归,其本身就有规律可言,找到了本质的东东,递归很好就能解决!
fallening 2009-03-13
  • 打赏
  • 举报
回复
[Quote=引用楼主 zhulinjia 的帖子:]
C/C++ codeintF(intn)//以 F(5) 为例{if( n>1)
{
F(n-1) ;
F(n-1) ;
}return1;
}

递归排序中也有个类似的函数  。这些函数有什么公式 或 规律 ?
[/Quote]
int F(int n)
{
//if( n>1)
// {
// F(n-1) ;
// F(n-1) ;
// }
return1;
}
shexinwei 2009-03-13
  • 打赏
  • 举报
回复
对呀,没什么用呀!
jakqigle 2009-03-13
  • 打赏
  • 举报
回复
这个程序干嘛用地啊?
void hanoi(int n,int a,int b,int c)
{
if(n > 0)
{
hanoi(n-1,a,c,b);
move(a,b);
hanoi(n-1,c,b,a);
}
}
chin_chen 2009-03-13
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 TeaTimeL 的回复:]
引用 4 楼 chin_chen 的回复:
C/C++ code
int F(int n)      //以 F(5) 为例
{
if( n > 1 )
{
return F(n - 1)+1 ;//改一下吧,你那样写不能递归的,每个分支得有一个return啊 ,不然就无穷下去了啊
}
return 1;
}


不用改的,这是递归。
递归过程如下:F(5)->F(F(4))->F(F(F(3)))->F(F(F(F(2))))->F(F(F(F(F(1)))))->F(F(F(F(1))))
->F(F(F(1)))->F(F(1))->F(1)
[/Quote]
但是这样结果无论如何都是1啊,没什么意义!
品茶 2009-03-13
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 chin_chen 的回复:]
C/C++ code
int F(int n) //以 F(5) 为例
{
if( n > 1 )
{
return F(n - 1)+1 ;//改一下吧,你那样写不能递归的,每个分支得有一个return啊 ,不然就无穷下去了啊
}
return 1;
}
[/Quote]

不用改的,这是递归。
递归过程如下:F(5)->F(F(4))->F(F(F(3)))->F(F(F(F(2))))->F(F(F(F(F(1)))))->F(F(F(F(1))))
->F(F(F(1)))->F(F(1))->F(1)
KevinYuen 2009-03-13
  • 打赏
  • 举报
回复
递归:
1 有多步同样的过程
2 最终会产生一个绝对返回值

过程是:从高调用到低,然后从低返回到高
liusichen_0 2009-03-13
  • 打赏
  • 举报
回复
[Quote=引用楼主 zhulinjia 的帖子:]
C/C++ codeint F(int n) //以 F(5) 为例
{
if( n > 1 )
{
F(n - 1) ;
F(n - 1) ;
}
return 1;
}



递归排序中也有个类似的函数 。这些函数有什么公式 或 规律 ?
[/Quote]

公式是没有的
规律还是有一点
都有最简单的可以直接返回的分支,每递归一次参数都会更接近那个简单的分支
zhoulehua 2009-03-13
  • 打赏
  • 举报
回复
此函数的功能本来就没什么意义
meteormeng 2009-03-13
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 chin_chen 的回复:]
C/C++ code

int F(int n) //以 F(5) 为例
{
if( n > 1 )
{
return F(n - 1)+1 ;//改一下吧,你那样写不能递归的,每个分支得有一个return啊 ,不然就无穷下去了啊
}
return 1;
}


[/Quote]
就是呀,我怎么觉得,这替归就归不了呢,前面的都没发现,还以为自己的替归学错了呢。
  • 打赏
  • 举报
回复
mark,吃饭先
chin_chen 2009-03-13
  • 打赏
  • 举报
回复

int F(int n) //以 F(5) 为例
{
if( n > 1 )
{
return F(n - 1)+1 ;//改一下吧,你那样写不能递归的,每个分支得有一个return啊 ,不然就无穷下去了啊
}
return 1;
}
sxbwelcome 2009-03-13
  • 打赏
  • 举报
回复
这个递归中的if没什么作用,它总是返回1
是不是程序敲错了
chin_chen 2009-03-13
  • 打赏
  • 举报
回复
很多初学者往往对递归迷惑不解,也在这上面花了不少的时间。其实教材上的例子很经典,只是它说的有一些唠叨了。初学者会看的头大的。编程是解决问题的,而现实中很多的问题都是比较简单的,没有象汉诺塔那么复杂。我们也不必追究递归到底是怎样实现的,我们只是要会用递归,会用递归来为我们解决一些问题,这就行了。
首先来看一个例子:

有一个Febonacci序列:

1,1,2,3,5,8,13,,21,34........

它的问题是:求这个序列中的第N个数。

由于它的函数原形是:f(N)=f(n-1)+f(n-2)

这用递归很容易就可以写出代码来,一点都不费事:

int Febc(int n) {

if(n<3) return (1);

else

return (Febc(n-1)+Febc(n-2));

}

噢~~~~~也许你会说递归真是太简单了,简直就是一个数学模型嘛,呵呵。

其实,递归函数的工作过程就是自己调用自己。有一些问题用递归就很容易解决,简单的你自己都会吃惊。

我们做事情,一般都是从头开始的,而递归却是从末尾开始的。比如上面的函数吧,当n>3时,它显然只能求助于n-1,n-2。而(n- 1)>2,(n-2)>2时,它们就求助于:(n-1)-1,(n-1)-2;(n-2)-1,(n-2)-2;然后··············直到(n-k)<3,(n-k-1)<3时,函数Febc终于有了返回值1 了,它再从头开始计算,然后一直算到n 为止。

通过上面的例子,我们知道递归一定要有一个停止的条件,否则递归就不知道停止了。在上面的例子中, if(n<3) return (1); 就是停止的条件。

然而,使用递归的代价是十分巨大的:它会消耗大量的内存!!递归循环时它用的是堆栈,而堆栈的资源是十分有限的。上面的例子你只能用一个很小的n值。如果 n=20,即Febc(20)的话,它将调用Febc(N)函数10000多次!!!而上面一个例子用循环也是十分容易写的:

/*using turboc2*/
int febc(int);
main()
{
int n;
scanf("%d",&n);
febc(N);
}

int febc(int n)
{
int a[3],i;
a[0]=a[1]=a[2]=1;
for(i=3;i<=n;i++)
a[i%3]=a[(i+1)%3]+a[(i+2)%3]; /*实现 Febc(I)=Febc(i-1)+Febc(i-2)*/
printf("\n%d\n",a[n%3]);
}

有兴趣者不妨输入一个较大的n值,然后比较比较这二个函数计算的速度。当然, 如果你使用的n太大的话,递归可能发生错误。如果死机了可别骂我哦~~~ 我已经提醒过你了 :)

现在我们再来看看一个求从1 加到100的循环:

/*turboc2*/

main()

{ int i,n;

for(i=1;i<101;i++)

n+=i; }

这很简单没什么可说的。 但是,你能不能写出相应的递归函数呢?

下面就是递归(请注意了,这种做法不推荐!! 我只是为了说明问题才这么写的。)

/*using Turboc2*/

int a=0;
int account(int);
main()
{
account(100);
printf("%d",a);
}
int account(int i)
{
if(i==1) return 1; /*停止条件*/
else
return (n+f(n-1)); /*此句有问题*/
}

在C/C++的问题中,我曾经回答过这样的一个问题:

若一头小母牛,从出生起第四个年头开始每年生一头母牛,按此规律,第n年时有多少头母牛? 请问如何用递归涵数求此问题?

先写出函数表达式:f(N)=f(n-1)+f(n-3)

为什么f(N)=f(n-1)+f(n-3)呢,请看:
f(N)-f(n-1)=f(n-3)
因为第n年要比n-1年多的牛,都是大于三岁的牛生的小牛,而f(n-3)正是那些在n年大于三岁的牛,然后它们在第n年生下相同数量的小牛。(请用BorlandC++3.1或其他C++编译器)

#include<iostream.h>
#include<conio.h>

int cattle(int,int);

void main()
{
int ct,n;
cout<<"Please input the original cattle number:"<<endl; /*输入起始牛的数量*/
cin>>ct;
cout<<"Input how many years it past:"<<endl;
cin>>n;
cout<<"You have "<<cattle(ct,n)<<" cattle now!"<<endl;
getch();
}

int cattle(int ct,int n)
{
if(n<4) return (ct); /*停止条件*/
else
return (cattle(ct,n-1)+cattle(ct,n-3)); /*实现递归*/
}


怎么样,很简单吧。 会用循环求解吗?

递归在实际的编程中并不常用,但是在某些情况下,它是非常强有力而漂亮的工具。掌握它的原理时会十分有用的。
太乙 2009-03-13
  • 打赏
  • 举报
回复
就飞波拉且数列吧:

1 1 2 3 5 8 13 21……

f(0) = f(1) = 1
f(n) = f(n-1) + f(n-2) (n>=2)

那么写个递归:

int f(int n)
{
if (0 == n || 1 == n)
{
return 1;
}
return f(n-1)+f(n-2);
}


很easy吧??

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧