// // main.c // 递归函数 // // Created by xiaomage on 15/6/7. // Copyright (c) 2015年 xiaomage. All rights reserved. // #include <stdio.h> void scanfNumber(); //声明 void test(); //声明 int main(int argc, const char * argv[]) { // 需求: 要求用户输入一个大于0的数, 如果用户输入的数不大于0那么就一直重复的提醒输入重新输入, 直到用户输入的值大于0为止 int number = -1; while (number < 0) { printf("请输入一个大于0的整数, 以回车结束 "); scanf("%i", &number); } printf("number = %i ", number); // 一般情况下, 能用循环做得事情, 用递归函数都能做 // 但是要注意: 不是什么时候都使用递归, 递归要慎用(性能问题) // 什么是递归函数: 函数自己搞自己 scanfNumber(); // 注意: 递归一定要由一个明确的结束条件, 否则会造成死循环(无限循环) test(); return 0; } void test() { printf("test "); test(); } void scanfNumber() { // 1.接收用户输入的值 int number = -1; printf("请输入一个大于0的整数, 以回车结束 "); scanf("%i", &number); // 2.判断用户输入的值是否合法 if (number < 0) { // 不合法, 需要重新输入 // 函数可以自己调用自己 scanfNumber(); }else { printf("number = %i ", number); } }
// // main.c // 递归函数练习 // // Created by xiaomage on 15/6/7. // Copyright (c) 2015年 xiaomage. All rights reserved. // #include <stdio.h> int myPow(int base, int n); int myPow2(int base, int n); int main(int argc, const char * argv[]) { /* 设计一个函数用来计算B的n次方 b = 2 n = 3 int result = b(3); b(0) = 1; // 计算0次方 b(1) = b(0) * b; // 0次方 * 当前的这个数 == 1次方 b(2) = b(1) * b; // 1次方 * 当前的这个数 == 2次方 b(3) = b(2) * b; // 2次方 * 当前的这个数 == 3次方 b(n) = b(n - 1) * b; 2(3) 2 * 2 * 2; result = 1 * 2; // 计算1次方 result = 2(result) * 2; // 1次方 * 当前的这个数 = 2次方 result = 2 * 2(result) * 2; // 2次方 * 当前的这个数 = 3次方 用上一次的结果 * 2 */ int a = 2; int b = 3; int resutl1 = myPow(a, b); int resutl = myPow2(a, b); printf("result = %i ", resutl); return 0; } /* 1.必须有一个明确的结束标志 2.自己调用自己 */ int myPow2(int base, int n) { int result = 1; if (n <= 0) { // 结束条件 return result; }else { return myPow2(base, n - 1) * base; } } int myPow(int base, int n) { // 1.定义变量保存计算的结果 int result = 1; // for (int i = 0; i < n; i++) { printf("%i * %i ", result, base); result = result * base; } return result; }
// // main.c // 递归练习2 // // Created by xiaomage on 15/6/7. // Copyright (c) 2015年 xiaomage. All rights reserved. // #include <stdio.h> int main(int argc, const char * argv[]) { // 用递归法求N的阶乘 /* 4! = 4 * 3 * 2 * 1 4! == 4 * 3! 3! == 3 * 2 * 1 4! == 4 * 3 * 2! 2! == 2 * 1 4! == 4 * 3 * 2 * 1! 1! = 1 4! == 4 * 3 * 2 *1 4! == 4 * 3! 3! == 3 * 2! 2! == 2 * 1! 1! == 1 n!= n * (n - 1)!; */ int a = 3; int result = factorial(a); printf("result = %i ", result); return 0; } int factorial(int n)// 3 2 1 { // 结束条件 if (n == 1) { return 1; }else { // return 3 * factorial(3 - 1); == return 3 * 2 // return 2 * factorial(2 - 1); == return 2 * 1; return n * factorial(n - 1); } }