c8---递归

//
//  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);
    }
}
原文地址:https://www.cnblogs.com/yaowen/p/7380692.html