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 = -;
while (number < ) {
printf("请输入一个大于0的整数, 以回车结束\n");
scanf("%i", &number);
}
printf("number = %i\n", number); // 一般情况下, 能用循环做得事情, 用递归函数都能做
// 但是要注意: 不是什么时候都使用递归, 递归要慎用(性能问题)
// 什么是递归函数: 函数自己搞自己
scanfNumber(); // 注意: 递归一定要由一个明确的结束条件, 否则会造成死循环(无限循环)
test();
return ;
} void test()
{
printf("test\n");
test();
} void scanfNumber()
{
// 1.接收用户输入的值
int number = -;
printf("请输入一个大于0的整数, 以回车结束\n");
scanf("%i", &number); // 2.判断用户输入的值是否合法
if (number < ) {
// 不合法, 需要重新输入
// 函数可以自己调用自己
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 = ;
int b = ;
int resutl1 = myPow(a, b);
int resutl = myPow2(a, b);
printf("result = %i\n", resutl);
return ;
}
/*
1.必须有一个明确的结束标志
2.自己调用自己
*/
int myPow2(int base, int n)
{
int result = ;
if (n <= ) {
// 结束条件
return result;
}else
{
return myPow2(base, n - ) * base;
}
} int myPow(int base, int n)
{
// 1.定义变量保存计算的结果
int result = ; //
for (int i = ; 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 = ;
int result = factorial(a);
printf("result = %i\n", result); return ;
}
int factorial(int n)// 3 2 1
{
// 结束条件
if (n == ) {
return ;
}else
{
// return 3 * factorial(3 - 1); == return 3 * 2
// return 2 * factorial(2 - 1); == return 2 * 1; return n * factorial(n - );
}
}
c8---递归的更多相关文章
- .NET 基础 一步步 一幕幕[面向对象之方法、方法的重载、方法的重写、方法的递归]
方法.方法的重载.方法的重写.方法的递归 方法: 将一堆代码进行重用的一种机制. 语法: [访问修饰符] 返回类型 <方法名>(参数列表){ 方法主体: } 返回值类型:如果不需要写返回值 ...
- 算法笔记_013:汉诺塔问题(Java递归法和非递归法)
目录 1 问题描述 2 解决方案 2.1 递归法 2.2 非递归法 1 问题描述 Simulate the movement of the Towers of Hanoi Puzzle; Bonus ...
- Android 算法 关于递归和二分法的小算法
// 1. 实现一个函数,在一个有序整型数组中二分查找出指定的值,找到则返回该值的位置,找不到返回 -1. package demo; public class Mytest { public st ...
- 二叉树的递归实现(java)
这里演示的二叉树为3层. 递归实现,先构造出一个root节点,先判断左子节点是否为空,为空则构造左子节点,否则进入下一步判断右子节点是否为空,为空则构造右子节点. 利用层数控制迭代次数. 依次递归第二 ...
- 递归实现n(经典的8皇后问题)皇后的问题
问题描述:八皇后问题是一个以国际象棋为背景的问题:如何能够在8×8的国际象棋棋盘上放置八个皇后, 使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行.纵行或斜线上 ...
- C语言用分别用递归和循环求数字的阶乘的方法
以下代码均为 自己 实现,嘻嘻! 参考文章:http://blog.csdn.net/talk_8/article/details/46289683 循环法 int CalFactorial(int ...
- C#递归解决汉诺塔问题(Hanoi)
using System;using System.Collections.Generic;using System.Linq;using System.Text; namespace MyExamp ...
- Java之递归求和的两张方法
方法一: package com.smbea.demo; public class Student { private int sum = 0; /** * 递归求和 * @param num */ ...
- C#语言基础——递归
递归 一.概念conception: 函数体内调用本函数自身,直到符合某一条件不再继续调用. 二.应满足条件factor: (1)有反复执行的过程(调用自身): (2)有跳出反复执行过程的条件(函数出 ...
- SQL Server封闭掉 触发器递归
SQL Server关闭掉 触发器递归SQL Server 是有一个开关, 可以关闭掉 触发器递归的.EXEC sp_dboption '数据库名字', 'recursive triggers', ...
随机推荐
- 对JVM还有什么不懂的?一文章带你深入浅出JVM!
本文跟大家聊聊JVM的内部结构,从组件中的多线程处理,JVM系统线程,局部变量数组等方面进行解析 JVM JVM = 类加载器(classloader) + 执行引擎(execution engine ...
- Mysql数据的增删改
插入数据 INSERT 更新数据 UPDATE 删除数据 DELETE 再来回顾一下之前我们练过的一些操作,相信大家都对插入数据.更新数据.删除数据有了全面的认识.那么在mysql中其实最重要的不 ...
- VirtualBox里如何正确安装增强工具(图文详解)
不多说,直接上干货! 找到 复制到
- css网页布局方式的理解
一,标准流(默认状态,元素盒按照文档中出现的顺序排列) 块级元素--垂直排版 display:block; 单独一行,可以设置宽高,宽度默认和父元素宽度一致 一般结构性标记都为块级元素,如div,h, ...
- 关于KO信息
最近写大论文查到KO也是可以用于分类的一种信息. 如何使用KEGG进行通路富集http://blog.sciencenet.cn/blog-364884-779116.html kegg 数据库学习笔 ...
- JavaEE学习记录
软件152谭智馗 一.JavaEE开发环境配置 1.准备以下压缩包 (1)JDK1.7:jdk1.7.rar (2)开发工具:eclipse-jee-mars-2 (3)项目管理工具:maven-3. ...
- 基于 vue2 导航栏透明渐变
在移动或者app 中经常会用,顶部导航栏固定,但是随着页面向上滚动,导航栏的透明度发生变化. 做法为: 1.首先给要滚动变化的导航添加 :style="style" <mt- ...
- 洛谷P1466 集合 Subset Sums_01背包水题
不多解释,适当刷刷水… Code: #include<cstdio> #include<algorithm> using namespace std; const int ma ...
- 网络流入门——EK算法
转载:https://www.cnblogs.com/ZJUT-jiangnan/p/3632525.html 网络流的相关定义: 源点:有n个点,有m条有向边,有一个点很特殊,只出不进,叫做源点. ...
- linux采用scp命令拷贝文件到本地,拷贝本地文件到远程服务器
// 假设远程服务器IP地址为 192.168.1.100 1.从服务器复制文件到本地: scp root@192.168.1.100:/data/test.txt /home/myfile/ roo ...