习题课(一)(函数递归调用)
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
老二想:如果老三能够帮 我计算出2的阶乘(fact2), 那么我老二设计函数就是: int fact3() { return 3*fact2(); }
老大设计的函数是: int fact4() { return 4*fact3(); }
递归法源之于函数的嵌套调用
师傅的调用程序是: int main() { printf(“4!=%d”,fact4()); } 老大设计的函数是: int fact4() { return 4*fact3(); } 老二设计的函数是: int fact3() { return 3*fact2(); }
10.2.1 程序解析
/* 函数定义 */
/* 递归出口 */
10.2.2 递归函数基本概念
递推法与递归法求阶乘
递推法
n!=1*2*3*....*n for (result = 1, i = 1; i <= n; i++) result = result * i;
递归法
递归定义 n! = n * (n-1)! (n > 1) n! = 1 (n = 0,1)
main fact4
老大设计的函数是: int fact4() { return 4*fact3(); } 老四设计的函数是: int fact1() { return 1*fact0(); }
fact3 fact2 fact1
老二设计的函数是: int fact3() { return 3*fact2(); } 小妹设计的函数是: int fact0() { return 1; }
老大设计的函数是: int fact4() { return 4*fact3(); }
老二设计的函数是: int fact3() { return 3*fact2(); }
递归法源之于函数的嵌套调用
师傅的调用程序是: int main() { printf(“4!=%d”,fact4()); } 老三设计的函数是: int fact2() { return 2*fact1(); } 老大设计的函数是: int fact4() { return 4*fact3(); } 老四设计的函数是: int fact1() { return 1*fact0(); } 老二设计的函数是: int fact3() { return 3*fact2(); }
递归法源之于函数的嵌套调用
师傅的调用程序是: int main() { printf(“4!=%d”,fact4()); }
老四想:如果小妹能够帮 我计算出0的阶乘(fact0), 老三设计的函数是: int fact2() 那么我老四设计函数就是: { return 2*fact1(); int fact1() } { return 1*fact0(); }
老二设计的函数是: int fact3() { return 3*fact2(); }
老二想:老大说的好听只做 n-1的阶乘,好像简 老三设计的函数是: 老四设计的函数是: 老五设计的函数是: int fact2() 单了一步,在没有告诉我具体的 n-1 的值之前, int fact1() int fact0() { { 我只能把你给我的 n-1看做n。不过也不难。只 { return 2*fact1(); return 1*fact0(); return 1; 的阶 要稍作修改,如果老三能够帮我计算出 n-1 } } } 乘fact2(n-1),那么我老二设计函数就是: int fact3(int n) { return n*fact2(n-1); }
老三设计的函数是: int fact2() { return 2*fact1(); }
递归法源之于函数的嵌套调用
师傅的调用程序是: int main() { int n=4; printf(“%d!=%d”,n,fact(n)); }
老大设计的函数是: int fact(int n) { return n*fact3(n-1); }
老大设计的函数是: int fact4() { return 4*fact3(); } 老四设计的函数是: int fact1() { return 1*fact0(); }
老二设计的函数是: int fact3() { return 3*fact2(); } 小妹设计的函数是: int fact0() { return 1; }
老二设计的函数是: int fact3(int n) { return n*fact2(n-1); } 小妹设计的函数是: int fact0() { return 1; }
老三设计的函数是: int fact2() { return 2*fact1(); }
递归法源之于函数的嵌套调用
师傅的调用程序是: int main() { int n=4; printf(“%d!=%d”,n,fact(n)); }
老大设计的函数是: int fact(int n) { return n*fact3(n-1); } 老四设计的函数是: int fact1() { return 1*fact0(); }
老二设计的函数是: int fact3() { return 3*fact2(); } 小妹设计的函数是: int fact0() { return 1; }
递归函数 fact(n)
递归法源之于函数的嵌套调用
递归法源之于函数的嵌套调用
话说:师傅要做4的阶乘 (fact4),交给老大去完 成。师傅的调用程序是:
int main() { printf(“4!=%d”,fact4()); }
递归法源之于函数的嵌套调用
师傅的调用程序是: int main() { printf(“4!=%d”,fact4()); }
老大设计的函数是: int fact4() { return 4*fact3(); }
老二设计的函数是: int fact3() { return 3*fact2(); }
递归法源之于函数的嵌套调用
师傅的调用程序是: int main() { printf(“4!=%d”,fact4()); } 老三设计的函数是: int fact2() { return 2*fact1(); }
师傅的调用程序是: int main() { printf(“4!=%d”,fact4()); } 老大设计的函数是: int fact4() { return 4*fact3(); }
递归法源之于函数的嵌套调用
师傅的调用程序是: int main() { printf(“4!=%d”,fact4()); }
老大设计的函数是: int fact4() { return 4*fawenku.baidu.comt3(); }
老二设计的函数是: int fact3() { return 3*fact2(); }
递归法源之于函数的嵌套调用
师傅的调用程序是: int main() { int n=4; printf(“%d!=%d”,n,fact(n)); }
递归法源之于函数的嵌套调用
师傅的调用程序是: int main() { printf(“4!=%d”,fact4()); }
老三想:如果老四能够帮 我计算出1的阶乘(fact1), 那么我老三设计函数就是: int fact2() { return 2*fact1(); }
老大设计的函数是: int fact4() { return 4*fact3(); }
老大设计的函数是: int fact(int n) { return n*fact3(n-1); }
老二设计的函数是: int fact3(int n) { return n*fact2(n-1); }
老大设计的函数是: int fact4() { return 4*fact3(); }
老二设计的函数是: int fact3() { return 3*fact2(); }
递归法源之于函数的嵌套调用
师傅的调用程序是: int main() { int n=4; printf(“%d!=%d”,n,fact(n)); }
递归法源之于函数的嵌套调用
师傅的调用程序是: int main() { printf(“4!=%d”,fact4()); }
老大想:如果老二能够帮 我计算出3的阶乘(fact3), 那么我老大设计函数就是: int fact4() { return 4*fact3(); }
递归法源之于函数的嵌套调用
习题课(二)10.2 递归函数
10.2.1 程序解析 10.2.2 递归函数基本概念
10.2.3 递归程序设计
例10-3 用递归函数求n!。 #include <stdio.h> double fact(int n); int main(void) { int n; scanf ("%d", &n); printf ("%f", fact (n) ); return 0; } double fact(int n) { double result; if (n==1 || n == 0) result = 1; else result = n * fact(n-1); return result; }
老三设计的函数是: int fact2() { return 2*fact1(); }
递归法源之于函数的嵌套调用
师傅的调用程序是: int main() { int n=4; printf(“%d!=%d”,n,fact(n)); }
老大想:这也不难,只要稍作 修改,如果老二能够帮我计算 老三设计的函数是: 老四设计的函数是: 小妹设计的函数是: int fact2() int fact1() 出 n-1 的阶乘 fact3 ,那么我老大 int fact0() { { { return 2*fact1(); 设计函数就是: return 1*fact0(); return 1; } } } int fact(int n) { return n*fact3(n-1); }
老二设计的函数是: int fact3() { return 3*fact2(); }
递归法源之于函数的嵌套调用
师傅的调用程序是: int main() { printf(“4!=%d”,fact4()); } 老三设计的函数是: int fact2() { return 2*fact1(); } 老大设计的函数是: int fact4() { return 4*fact3(); } 老二设计的函数是: int fact3() { return 3*fact2(); }
递归法源之于函数的嵌套调用
师傅的调用程序是: int main() { printf(“4!=%d”,fact4()); }
小妹想:0的阶乘不就是1 吗,如此简单,于是设计 老三设计的函数是: 函数就是: 老四设计的函数是: int fact2() int fact1() { int fact0() { return 2*fact1(); return 1*fact0(); } { } return 1; }
fact0
递归法源之于函数的嵌套调用
师傅的调用程序是: int main() { printf(“4!=%d”,fact4()); }
现在师傅要求高了:要做n的阶 老三设计的函数是: 老四设计的函数是: 小妹设计的函数是: 乘 fact (n) ,交给老大去完成。 int fact2() int fact1() int fact0() { { 师傅的调用程序是: { return 2*fact1(); return 1*fact0(); return 1; } } int main() } { int n=4; printf(“%d!=%d”,n,fact(n)); }
递归法源之于函数的嵌套调用
师傅的调用程序是: int main() { int n=4; printf(“%d!=%d”,n,fact(n)); }
老大设计的函数是: int fact(int n) { return n*fact3(n-1); } 老四设计的函数是: int fact1() { return 1*fact0(); }