- 1、本文档共50页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
函数的递归调用 函数调用它本身,称为递归。直接在函数内调用自己为直接递归,通过别的函数调用自己为间接递归。 void a( ){...... a( );......} void a( ){...... b( ); ......}void b( ){...... a( ); ......} 递归在解决某些问题中,是一个十分有用的方法。因为其一,有的问题它本身就是递归定义的;其二,它可以使某些看起来不易解决的问题变得容易解决,写出的程序较简短。 递归方法求n! 由于 n!= n*(n-1)! 是递归定义 所以求n! ?(n-1)! (n-1)! ?(n-2)! (n –2)! ?(n-3)! …… ? 0!的问题, 根据公式有0!=1。 再反过来依次求出1!,2!……直到最后求出n!。 递归方法求n! long fac( int n){long f; if (n==0) f=1; else f=n* fac(n-1); return f;}main( ){long y; int n; scanf(“%d”,n); y=fac(n); printf(“%d!=%ld”,n,y);} 刚开始的时候,这个n是前面输入的需要阶乘的n 所以在这里带入的值是n 而这个函数里又调用了本身,不过参数已经变成了n-1 所以这里再次调用时参数已经变成了n-1 注意:上次调用fac(n)还没有完,只是由于遇到了fac(n-1)而执行fac(n-1)去了. 而在调用fac(n-1)时同样遇到了要调用fac(n-2)的 问题,于是一层一层的包裹下去,每次调用的时候都会在内部调用一个结构相同但变量不同的函数,直到。。。 直到调用到fac(0)时, 由于内部if判断,已经不需要再继续调用另一个fac(n-1),而直接有了f=1 fac(0)已经执行完毕,它的返回值被fac(1)中的f=n*fac(n-1)语句赋给了f值,同时返回了f。 而这个返回的f又被fac(2)乘上当前的n值以后继续返回f 直到最后的fac(n)都做完了,f的值被返回到了它的调用点:主函数中,这样就是一个递归运算。 辗转相除法求最大公约数 求 m和 n 的公约数算法 if (m % n) == 0 n 是公约数; else 求 n 和 m % n 的公约数; 求最大公约数的递归算法 int gcd(int m, int n) { if (m % n) == 0 return n ; else return gcd(n, m % n); } 求最大公约数的主函数 void main() { int m,n,t;int gcd(int m, int n);scanf(“%d %d”,m,n);if (mn) {t=a; a=b; b=t; }t= gcd( m, n); /*调用函数gcd( m, n); */ print(“\n gcd=%d”,t); } 汉诺塔 说到递归,就不能不提汉诺塔,汉诺塔是一个很繁杂的游戏,但可以用递归的方法异常简单的完成。 规则:(1) 一次只能移动一个 (2) 大的不能放在小的上面 (3) 只能在三个位置中移动 问题可分为三个步骤 对于把n个金片从第一根针a上移到第三根针c的问题可以分解成如下步骤: (1)将n-1个金片从a经过c 移动到b。 (2)将第n个金片移动到c。 (3)再将n-1个盘子从b经过a移动到c。 这样我们就将移动n个金片的问题变成了移动n-1个金片的问题。这样做下去的话最后就会变成移动一个金片的问题。 递归方法解汉诺塔 void hanoi(int n, int a, int b, int c){ if (n==1) printf(“%d -%d”,a,c); else { hanoi(n-1,a,c,b); printf(“%d -%d”,a,c); hanoi(n-1,b,a,c); }} n=1时, 直接将金片从a移动到c n-1个金片从a经过c 移动到b 将第n个金片从a移动到c 再将n-1个盘子从b经过a移动到c main( )
文档评论(0)