注册 登录
编程论坛 C++教室

[求助]初学递归。

a8451727 发布于 2007-07-05 15:26, 1532 次点击

例如计算阶乘:

int factorial(int n)
{
assert(n>=0);
if(n==0)
return 1;
else
return n*facotorial(n-1);}

我看了很久也不明白他的意思。
他调用本身,哪个是他本身?if(n==0) return 1; 这个?
facotorial(n-1)的值是什么?还要往上推算?怎么可以单单从if(n==0) return 1;得来的?

或者有人拿一道,你觉得更易懂的例子指点下吗


24 回复
#2
cclearner2007-07-05 16:33
本身就是整个函数本身
相当于把n-1代到本来是n的位置
也就是下一次运算是相当于计算
n*(n-1)*facotorial(n-2)
并且当有具体的n为某个数时就是每次递减一的数了


我也是菜鸟!!!自己悟的。不知道对不对。
请高手指教。

不过为什么每次递减完的数都保存了状态呢?也就是省掉了循环递减,我不明白阿!
#3
aipb20072007-07-05 16:52
不过为什么每次递减完的数都保存了状态呢?也就是省掉了循环递减,我不明白阿!

梯归有个压栈的过程,当前次调用的变量信息被栈储存。
#4
cclearner2007-07-05 16:55
哦,被存了?仅限这种楼主写的递归形式么?(不知道还有没有别的形式)
压栈?哦,头一次听,没学,
#5
aipb20072007-07-05 17:04
回复:(cclearner)哦,被存了?仅限这种楼主写的递归...
不是,所有的递归都有栈操作的过程。
尾部递归在有的编译器中,没有压栈操作。

递归很难理解,加油吧。多看书。
#6
a84517272007-07-05 18:44
那Fibonacci数列该如何用递归写?
应该不是 n+Fibonacci(n-1)了吧?
头都大了

#7
cclearner2007-07-05 19:58
我书上有,有空给你发上来
#8
a84517272007-07-05 20:27
好的  先谢谢了。
#9
cclearner2007-07-05 20:45

int Fibonacci(int n);

int main()
{
int n, answer;
cout << "Enter number: ";
cin >> n;
cout << "\n\n";

answer = Fibonacci(n);
cout << answer << " is the " << n << "th Fibonacci number\n";
return 0;
}

int Fibonacci (int n)
{
cout << "Processing Fibonacci(" << n << ")... ";
if (n < 3 )
{
cout << "Return 1!\n";
return (1);
}
else
{
cout << "Call Fibonacci(" << n-2 << ") and Fibonacci(" << n-1 << ").\n";
return( Fibonacci(n-2) + Fibonacci(n-1));
}
}

#10
野比2007-07-05 22:27

递归体现在8086上就是不停的CALL-PUSH-RET-CALL-PUSH-RET...POP-POP...
最简单的形式是这样的..
函数(参数){
if(参数==结束条件){
返回结束值;
}
计算;
return 函数(参数);
}

------------
哦...cclearner越来越高手咯... 加油哦..

#11
cclearner2007-07-05 23:13
这个 Fibonacci不是我写的哦,是教材上的~
我不能把这个归为自己的劳动成果~
#12
野比2007-07-05 23:40

好好消化... 递归挺棒的..
参考那个讨论Hanoi的帖子... 那个是递归的经典...

#13
cclearner2007-07-05 23:46
那个帖子的源代码我死活是一点也看不懂啊!
#14
a84517272007-07-05 23:52
好吧,我多看下书再请教大家吧谢谢大家的帮忙了  呵

[此贴子已经被作者于2007-7-6 1:20:25编辑过]


#15
野比2007-07-05 23:54

看不懂啊 ...
慢慢看... 我第一次研究Hanoi是用VB实现的... 那个看起来简单些..

#16
璇璇贺贺2007-07-06 03:04

递归我们刚刚学过,不过还是不太会。
也遇到了同样的问题。
谢谢2楼指点
Fibonacci数列我们的书上也有
自己也动手敲了几下
算是学会了吧,哈哈!!!
谢了

#17
zkkpkk2007-07-06 08:25
看看这个吧
只有本站会员才能查看附件,请 登录

#18
cclearner2007-07-06 16:15
to 野比斑竹
我听说vb比vc好学,不过如果可以的话我可以去考虑看看VB,只是递归这一点,因为我以后不会用到vb的,如果斑竹认为这样做有意义的话,能推荐一本书么,我去看看。
谢谢了啊。(ps:我是非专业人士哦)
#19
野比2007-07-06 20:51

VB确实好学,因为它的思路比C更接近自然语言思维过程...不过也没有必要因为学递归去看VB.. VB深层的东西也非常复杂强大...
你都晓得以后不用, 为啥要去学呢? 是不?
学好C++..以后转C#也行...
加油把.

ps.我是专业的...专业非编程人士...

#20
cclearner2007-07-06 23:19

专业非编程。。。。。?
真不知道这种说法,呵呵
我是搞理工的,开计算机编程课,真晕~
是不是以后学数据结构啥的会好?

#21
sy_1416182007-07-07 14:15
哎哟。。我还有好长的路要走呢。。但是我不笨!我会努力学的!!
#22
zkkpkk2007-07-08 19:35
以下是引用sy_141618在2007-7-7 14:15:31的发言:
哎哟。。我还有好长的路要走呢。。但是我不笨!我会努力学的!!

那你比我幸运,我觉得我笨死了

#23
野比2007-07-08 20:18
以下是引用zkkpkk在2007-7-8 19:35:53的发言:

那你比我幸运,我觉得我笨死了

你还真谦虚... 76道练习题做题狂人第2名...

#24
野比2007-07-08 20:26
以下是引用cclearner在2007-7-6 23:19:38的发言:

专业非编程。。。。。?
真不知道这种说法,呵呵
我是搞理工的,开计算机编程课,真晕~
是不是以后学数据结构啥的会好?


是的.. 而且等学微机原理后对深层次的理解就加深好多...

#25
sy_1416182007-07-09 03:15
1