C primer Plus 9.3.4 递归和倒序计算 DE3
递归在处理倒序时非常方便
(在解决这类问题中,递归比循环简单)
我们要解决的问题是:编写一个函数,打印一个整数的二进制数,
二进制表示法根据 2 的幂来表示数字
例如,十进制数 234 实际上是 2×102+3×101+4×100,所以二进制数101实际上是1×22+0×21+1×20。二进制数 由0和1表示。
我们要设计一个以二进制形式表示整数的方法或算法。例如:如何用二实际上是进制表示十进制数5?
在二进制中,奇数的末尾一定是1,偶数的末尾一定是0
所以通过5%2即可确定5的二进制数的最后一位是1还是0.一般而言,一
般而言,对于数字n,其二进制的最后一位是 n % 2
因此,计算的第一位数字实际上是待输出二进制数的最后一位。这一规律提示我们,在递归和递归调用之前计算n%2,在递归调用之后打印计算结果。这样,计算的第一个值正好是最后一个打印的值
要获得下一位数字,必须把原数除以二,这种计算方法相当于在十进制下把小数点左移一位,如果计算结果是偶数,那么二进制的下一位数就是0,是奇数,就是1;
5%2余1 是奇数 第一位就是1
5/2商 2是偶数 2%2商1 余0 ,那么二进制的第二位数就是0
1/2余1 第三位二进制数就是1
那么表示5的二进制数就是101
那么程序何时停止计算? 当与2相除的结果小于2时,停止计算
因为只要结果大于或等于2,就说明还有二进制位,每次除以二就相当于去掉一位二进制,直到计算出最后一位为止
(如果不好理解, 600可以拿十进制数来做类比:628%10得8,因此8就是该数最后一位;而 628/10得62,而62%10得2,所以该数的下一位是2,以此类推)。程序清单 9.8演示了上述算法)
/*以二进制的形式打印制整数*/
#include <stdio.h>
#include <stdlib.h>int main()
{unsigned long number; ///用无符号长整型是为了提高能输入的数的范围printf("Enter an integer ( q to quit): \n"); ///提示用户输入信息while( scanf("%ld",&number) == 1){printf("Binary equivalent:\n");to_binary(number);putchar('\n');printf("Enter an integer ( q to quit): \n");}printf("Hello world!\n");return 0;
}void to_binary( unsigned long n) ///递归函数
{int r;r=n%2;if(n>=2)to_binary(n/2); ///这个位置的意思其实就是n=n/2 ,在除的过程中就已经将n的值改变了putchar( r == 0 ? '0' : '1');return;
}
在该程序中,如果r的值是零,to_binary()函数就显示字符‘0’;如果r的值是1,则其显示1条件表达式r == 0 ? ‘0’ : '1’用于把数值转 换成字符
不用递归,是否能实现这种用二进制形式表示整数的想法?
但由于这种算法要首先计算最后一位二进制数,所以在显示结果之前必须把所有的位数都储存在别处(例如:数组)
9.3.5 递归的优缺点
优点是递归为某些编程问题提供了最简单的解决方案
缺点是一些递归算法会快速消耗计算机的内存资源。另外,递归不方便阅读和维护
**
斐波那契数列如下:第一个和第二个数字都是1 ,而后续的每个数字都是前两个数字之和
**
例如,该数列的前几个数是:1、1、2、3、5、 8、13。
下面,
我们要创建一个函数,接受正整数n,返回相应的斐波那契数值
,首先,来看递归。递归提供一个简单的定义。如果把函数命名为Fibonacci();那么如果n是1或2,Fibonacci(n)
应返回一;对于其他数值,则应返回Fibonacci(n-1)+Fibonacci(n-2);
双递归
为了说明这个问题,假设调用 Fibonacci(40)。这是第1 级递归调用,将 创建一个变量 n。然后在该函数中要调用Fibonacci()两次,在第2级递归中要 分别创建两个变量n。这两次调用中的每次调用又会进行两次调用,因而在 第3级递归中要创建4个名为n的变量。此时总共创建了7个变量。由于每级递 归创建的变量都是上一级递归的两倍,所以变量的数量呈指数增长!在第 5 章中介绍过一个计算小麦粒数的例子,按指数增长很快就会产生非常大的 值。在本例中,
指数增长的变量数量很快就消耗掉计算机的大量内存,很可 能导致程序崩溃。
虽然这是个极端的例子,但是该例说明:在程序中使用递归要特别注 意,尤其是效率优先的程序
C函数皆平等
程序中的每个C函数与其他函数都是平等的。每个函数都可以调用其他 函数,或被其他函数调用
。这点与Pascal和Modula-2中的过程不同**,虽然过 程可以嵌套在另一个过程中,但是嵌套在不同过程中的过程之间不能相互调 用**。
main()函数是否与其他函数不同?是的,main()的确有点特殊。当 main()与程序中的其他函数放在一起时,最开始执行的是main()函数中的第1 条语句,但是这也是局限之处。
main()也可以被自己或其他函数递归调用 ——尽管很少这样做。
C primer Plus 9.3.4 递归和倒序计算 DE3相关推荐
- 【例1】 给定n(n>=1),用递归的方法计算1+2+3+4+...+(n-1)+n。
/* [例1] 给定n(n>=1),用递归的方法计算1+2+3+4+...+(n-1)+n. [算法分析]本题可以用递归方法求解,其原因在于它符合递归的三个条件:(1)本题是累加问题:当前和=前 ...
- php求及格,详解PHP通过递归实现提成计算
本文主要介绍了PHP实现的递归提成方案,以完整实例形式较为详细的分析了PHP提成方案的数据库设计及功能实现技巧,涉及PHP数学运算的相关技巧.需要的朋友可以参考下,希望对大家有所帮助. 最近CRM项目 ...
- C#递归、动态规划计算斐波那契数列
//递归public static long recurFib(int num){if (num < 2){return num;}else{return recurFib(num - 1) + ...
- 递归——数的计算(洛谷 P1028)
题目选自洛谷P1028 读完题目很容易想到用递归,但是当输入的数据比较大以后,直接递归会超时了, 所以采用记忆化搜索的方式进行递归,当然这道题也可以用递推的方式直接求解. 题目描述 我们要求找出具有下 ...
- 本题要求递归实现一个计算非负整数阶乘的简单函数。
求 1!+2!+3!+...+n! 的值 函数接口定义: double fact( int n ); double factsum( int n ); 函数fact应返回n的阶乘,建议用递归实现.函数 ...
- 数据结构::递归时间复杂度的计算
开篇前言:为什么写这篇文章?笔者目前在学习各种各样的算法,在这个过程中,频繁地碰到到递归思想和分治思想,惊讶于这两种的思想的伟大与奇妙的同时,经常要面对的一个问题就是,对于一个给定的递归算法或者用分治 ...
- 本题要求递归实现一个计算X的N次方 (n≥1)的函数。
函数接口定义: double calc_pow( double x, int n ); 函数calc_pow应返回x的n次幂的值.建议用递归实现.题目保证结果在双精度范围内. 裁判测试程序样例: #i ...
- C语言输入整数123输出321,C语言 递归调用倒序输出 设计一个函数,要求能将一个正整数n倒序输出,n的位数不定,列如:123,输出:321...
匿名用户 1级 2011-03-30 回答 #include #include #define MAX 100 void digui_daoxu(char num[],int n) { if(n> ...
- 【蓝桥java】递归基础之计算共多少种走法
计算从某个位置(x,y)走到(0,0) 一共多少种走法 代码实现: package xn.zzunit.recurrence;/*** 从某个位置(x,y)走到(0,0) 一共多少种走法* @auth ...
最新文章
- Linux磁盘配额应用
- NUMECA FINE Turbo 14中文版
- SpringBoot - 优雅的实现【参数校验】高级进阶
- MySQL数据库备份(INTO OUTFILE)
- c语言——什么时候使用getchar()读取换行符
- 【多视图几何】TUM 课程 第2章 刚体运动
- 接口有个电池标志_有人说手机快充毁电池,真的假的?电池快充的原理是什么?...
- JavaScript中的Boolean 方法与Number方法
- spark broadcast的TorrentBroadcast实现
- oracle 外键约束不检查历史数据_如何一键禁用Oracle所有外键约束?
- 程序员真的是太太太太太太太太难了!
- 我坚决不能容忍_出轨坚决不能忍,3星座女对出轨0容忍,敢出轨就等着吧
- 万年历插件软件测试,万年历的程序代码
- 以Apollo为例学习/分析自动驾驶运动规划算法
- DES加密解密Delphi、C#互通
- Altium设置菜单之系统菜单
- Anaconda打开多个spyder窗口
- java 狗带风波_养狗风波作文800字
- 一套计算机网络系统设计方案,包含外网、内网、智能化设备网
- 二手房数据的分析与挖掘(七)-- 预测房价