递归怎么样理解

来源:百度知道 编辑:UC知道 时间:2024/05/28 18:42:24
long ff(int n)

{

long f;

if(n<0) printf("n<0,input error");

else if(n==0||n==1) return 1;

else f=ff(n-1)*n;

return(f);

}

main()

{

int n;

long y;

printf("\ninput a inteager number:\n");

scanf("%d",&n);

y=ff(n);

printf("%d!=%ld",n,y);

}假设n是5
f=ff(n-1)*n怎么样理解这个递归
*n这个数是不变的吗晕看间递归就头疼求大家帮帮菜鸟~~

要理解递归,你要有比较强的逻辑能力与数学能力。
你的代码是阶乘,数学定义 f(n)=n*f(n-1),写成代码就是
return n*f(n-1);

至于怎么从代码里理解递归,有时是很困难的。一般来说,你要理解子问题,再理解子问题与略大一点的问题的关系,即理解f(n-1)是什么,f(n-1)怎么变换成f(n)的。理解了这一层,就把递归

不考虑特例(即ff的参数为0/1的时候),执行的过程是这样的:

调用ff(n-1)
  调用ff(n-2)
    调用ff(n-3)
...
...
    ff(n-3)返回
  ff(n-2)返回
ff(n-1)返回

应该能看明白吧?

其实递归并不难,只要你把每次递归调用都当作外部调用一样理解就不会太费神。

这个递归函数中的n是会变的,每次递归调用,n的值都是上一层中的n值减1{因为有ff(n-1)}

程序调用自身的编程技巧称为递归( recursion)。递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。

递归,就是在运行的过程中调用自己。
构成递归需具备的条件:
1. 子问题须与原始问题为同样的事,且更为简单;
2. 不能无限制地调用本身,须有个出口,化简为非递归状况处理。
在数学和计算机科学中,递归指由一种(或多种)简单的基本情况定义的一类对象或方法,并规定其他所有情况都能被还原为其基本情况。
例如,下列为某人祖先的递归定义:
某人的双