//
// 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的整数, 以回车结束\n");
scanf("%i", &number);
}
printf("number = %i\n", number);
// 一般情况下, 能用循环做得事情, 用递归函数都能做
// 但是要注意: 不是什么时候都使用递归, 递归要慎用(性能问题)
// 什么是递归函数: 函数自己搞自己
scanfNumber();
// 注意: 递归一定要由一个明确的结束条件, 否则会造成死循环(无限循环)
test();
return 0;
}
void test()
{
printf("test\n");
test();
}
void scanfNumber()
{
// 1.接收用户输入的值
int number = -1;
printf("请输入一个大于0的整数, 以回车结束\n");
scanf("%i", &number);
// 2.判断用户输入的值是否合法
if (number < 0) {
// 不合法, 需要重新输入
// 函数可以自己调用自己
scanfNumber();
}else
{
printf("number = %i\n", 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\n", 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\n", 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\n", 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);
}
}