pascal递归求助高手。。
递归类的pascal题自己做想不到。看了答案才明白。都是做一道会一道。谁能给我好好讲讲递归思想能让我举一反三啊。...
递归类的pascal题自己做想不到。看了答案才明白。都是做一道会一道。谁能给我好好讲讲递归思想能让我举一反三啊。
展开
1个回答
展开全部
所谓递归就是一个函数或过程可以直接或间接地调用自己。我们大家都熟悉一个民间故事:从前有一座山,山上有一座庙,庙里有一个老和尚正在给小和尚讲故事,故事里说,从前有一座山,山上有一座庙,庙里有一个老和尚正在给小和尚讲故事,故事里的故事是说……。象这种形式,我们就可以称之为递归的一种形象描述,老和尚什么时候不向下讲了,故事才会往回返,最终才会结束。
例如求N!(N的阶乘):
我们知道:当N>0时,N!=N*(N-1)!,因此,求N!的问题化成了求N*(N-1)!的问题,而求(N-1)!的问题又与求N!的解法相同,只不过是求阶乘的对象的值减去了1,当N的值递减到0时,N!=1,从而结束以上过程,求得了N!的解。
递归的调用:
在Pascal程序中,子程序可以直接自己调用自己或间接调用自己,则将这种调用形式称之为递归调用。其中,我们将前者的调用方式称为简单递归,后者称为间接递归。在此介绍直接递归。
递归调用时必须符合以下三个条件:
(1)可将一个问题转化为一个新的问题,而新问题的解决方法仍与原问题的解法相同,只不过所处理的对象有所不同而已,即它们只是有规律的递增或递减。
(2)可以通过转化过程使问题回到对原问题的求解。
(3)必须要有一个明确的结束递归的条件,否则递归会无止境地进行下去。
参考刚才求N!的程序:
program
jiecheng;
var
t:longint;
n:integer;
function
fac(n:integer):longint;{fac函数}
begin
if
n=0
then
fac:=1{递归调用的终止条件:n=0时,0的阶乘为1}
else
fac:=fac(n-1)*n;{n不为1时就递归调用}
end;
begin
write('input
n=');
read(n);{读入n}
if
n<0
then
writeln('n<0,data
errer'){确保n不小于0}
else
begin
t:=fac(n);{调用fac函数}
writeln(n,'!
=',t){输出}
end
end.
还有什么不明白的继续问。
例如求N!(N的阶乘):
我们知道:当N>0时,N!=N*(N-1)!,因此,求N!的问题化成了求N*(N-1)!的问题,而求(N-1)!的问题又与求N!的解法相同,只不过是求阶乘的对象的值减去了1,当N的值递减到0时,N!=1,从而结束以上过程,求得了N!的解。
递归的调用:
在Pascal程序中,子程序可以直接自己调用自己或间接调用自己,则将这种调用形式称之为递归调用。其中,我们将前者的调用方式称为简单递归,后者称为间接递归。在此介绍直接递归。
递归调用时必须符合以下三个条件:
(1)可将一个问题转化为一个新的问题,而新问题的解决方法仍与原问题的解法相同,只不过所处理的对象有所不同而已,即它们只是有规律的递增或递减。
(2)可以通过转化过程使问题回到对原问题的求解。
(3)必须要有一个明确的结束递归的条件,否则递归会无止境地进行下去。
参考刚才求N!的程序:
program
jiecheng;
var
t:longint;
n:integer;
function
fac(n:integer):longint;{fac函数}
begin
if
n=0
then
fac:=1{递归调用的终止条件:n=0时,0的阶乘为1}
else
fac:=fac(n-1)*n;{n不为1时就递归调用}
end;
begin
write('input
n=');
read(n);{读入n}
if
n<0
then
writeln('n<0,data
errer'){确保n不小于0}
else
begin
t:=fac(n);{调用fac函数}
writeln(n,'!
=',t){输出}
end
end.
还有什么不明白的继续问。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询