走台阶 OR 台阶走——《狂人C》习题解答14(第三章习题4)

题目:

4. 有一段楼梯有6级台阶,规定每一步只能跨一级或两级,要登上第6级台阶有几种不同的走法?

     这个题目从数学角度来看可能有一点难度,但一经点破也就没什么难度了。
     首先第1级台阶只有一种走法。第2级台阶有两种走法,因为可以直接跨上,也可以从第1级跨上。
     换句话说,由于登上第2级台阶可以从第0阶(最初的状态)也可以从第1阶登上,所以
          登上第2级台阶的走法的数目 = 登上第0级台阶的走法的数目 + 登上第1级台阶的走法的数目
其中登上第0级台阶的走法的数目显然为1种。 
     这个道理就如同到某地有三条陆路两条水路,那么到该地一共有五条路一样。
     后面各阶走法的数目的求法和第2阶的求法类似。
     描述这个求解过程的代码为:

#include <stdio.h>
#include
<stdlib.h>

int main( void )
{
int num_of_step0 = 1 , num_of_step1 = 1 , num_of_step2 , ,
num_of_step3 , num_of_step4 , num_of_step5 , num_of_step6;

num_of_step2
= num_of_step1 + num_of_step0 ;
num_of_step3
= num_of_step2 + num_of_step1 ;
num_of_step4
= num_of_step3 + num_of_step2 ;
num_of_step5
= num_of_step4 + num_of_step3 ;
num_of_step6
= num_of_step5 + num_of_step4 ;

printf(
"登上第6级台阶有%d种不同的走法\n" , num_of_step6 );

system(
"PAUSE");
return 0;
}

     这种写法的缺点是变量太多,如果阶数更多,就需要定义更多的变量。那样的话即使不把人累死也会把人给笨死。
     因为这种方法仿佛是自己从第2阶走到第6阶,如果走的阶数很多,那确实很累人。
     实际上,走台阶是从人的主观出发的一种想法,这种情况关心有多少级台阶是很自然的想法;但是如果换一种情境,稍微发挥一点想象力的话,不难发现如果人不动让台阶反方向"走",问题的本质是一样的。这时你不会关心一共有多少级台阶,你只会也只需要关心后面的两级台阶和当前面对的台阶。也就是 
          登上当前台阶走法的数目 = 登上后面第1级台阶走法的数目 + 登上后面第2级台阶走法的数目
     不难看出,这是一种基于"相对"的思考方法和描述方法,而前面那种写法则是基于"绝对"的思考方法和描述方法。
     台阶反方向"走"一步之后,状态就变了。后面第1级台阶变成了后面第2级台阶,可以描述为 
          登上后面第2级台阶走法的数目 = 登上后面第1级台阶走法的数目
     而当前面对的台阶则变成了后面第1级台阶,因而
          登上后面第1级台阶走法的数目=当前台阶走法的数目
     现在你会发现你要解决的是和刚才完全一样的问题。后面的代码可以如法炮制。 
     反复解决同样的问题是令人愉快的,这样的代码好写也不容易错,只要认真把第一次写对,然后复制粘贴就可以了。 代码为:

#include <stdio.h>
#include
<stdlib.h>

int main( void )
{
int num_of_current_step , //当前面对台阶走法数目
num_of_passed_step1 , //后面第1级台阶走法数目
num_of_passed_step2 ; //后面第2级台阶走法数目

//在第0阶时
num_of_current_step = 1 ; //根据分析

//在第1阶时
num_of_passed_step1 = num_of_current_step ; //当前退后1阶
num_of_current_step = 1 ; //根据分析

//在第2阶时
num_of_passed_step2 = num_of_passed_step1 ; //退后1阶
num_of_passed_step1 = num_of_current_step ; //退后1阶
num_of_current_step = num_of_passed_step1
+ num_of_passed_step2 ; //当前等于后面两阶之和

//在第3阶时 。从这里开始可以复制粘贴了
num_of_passed_step2 = num_of_passed_step1 ; //退后1阶
num_of_passed_step1 = num_of_current_step ; //退后1阶
num_of_current_step = num_of_passed_step1
+ num_of_passed_step2 ; //当前等于后面两阶之和

//在第4阶时
num_of_passed_step2 = num_of_passed_step1 ; //退后1阶
num_of_passed_step1 = num_of_current_step ; //退后1阶
num_of_current_step = num_of_passed_step1
+ num_of_passed_step2 ; //当前等于后面两阶之和

//在第5阶时
num_of_passed_step2 = num_of_passed_step1 ; //退后1阶
num_of_passed_step1 = num_of_current_step ; //退后1阶
num_of_current_step = num_of_passed_step1
+ num_of_passed_step2 ; //当前等于后面两阶之和
//在第6阶时
num_of_passed_step2 = num_of_passed_step1 ; //退后1阶
num_of_passed_step1 = num_of_current_step ; //退后1阶
num_of_current_step = num_of_passed_step1
+ num_of_passed_step2 ; //当前等于后面两阶之和

printf(
"登上第6级台阶有%d种不同的走法\n" , num_of_current_step );

system(
"PAUSE");
return 0;
}

     这种写法无疑更加简单也更强大,因为变量少,而且很容易扩展为解决其他阶数同样的问题。更主要的是后面几段代码可以通过复制粘贴不做任何修改简单地完成。
     可能有人觉得第2种写法代码太长,这个问题在后面学习了循环控制语句之后很容易解决。代码的结构简单是更重要的。第2段代码由于是在反复做同样的事(这恰恰是计算机的长处),所以结构是简单的。而第一段代码,复制粘贴后由于需要修改变量名,从某种意义上来说,结构在不断变化,因而是复杂的。况且修改变量名很容易发生错误,这也可以视为更加复杂。 
     只要有可能,尽量写简单的代码是编程的一项基本原则,这就是所谓的KISS原则——Keep It Simple Stupid。
     然而我们从前面不难看到,写出简单不易错的代码往往是需要多动一些脑筋的,而复杂容易错的代码则往往是不加思索一蹴而就的产物。
     有句名言:把事情变简单很复杂,把事情变复杂很简单。
     这话我们似乎同样可以理解为写代码是简单的,但在写代码之前的思考则是复杂的。
     对于高手来说,一旦开始写代码,那就往往意味着代码即将完成。看似简单轻松完成的东西,其实写之前在心里不知布局谋划苦心经营了多久。 
     初学者往往一拿到题目就立刻开始写代码,这是很不好的编程习惯,绝对不会写出优秀的代码。

转载于:https://www.cnblogs.com/KBTiller/archive/2011/07/15/2107161.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/462575.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ZOJ-2587 Unique Attack 最小割的唯一性判定

题意&#xff1a;给定一个无向图&#xff0c;要求判定分离两个点的最小割是否唯一。 解法&#xff1a;在求出最大流的基础上&#xff0c;从源点进行一次搜索&#xff0c;搜索按照未饱和的边进行&#xff0c;得到顶点子集S的顶点个数&#xff1b;再从汇点反向搜索未饱和的边&…

#define va_arg(AP, TYPE)

Linux内核 stdarg.h 中&#xff1a; #define va_arg(AP, TYPE) / (AP __va_rounded_size (TYPE), / *((TYPE *) (AP - __va_rounded_size (TYPE)))) 为&#xff0c;AP 指针先向前移动&#xff08;sizeof&#xff08;Type&#xff09;&#xff09;位&#xff0c; 再获取前指针点…

新手学html 第一节:html简介

什么是 HTML&#xff1f; HTML&#xff08;Hypertext Markup Language&#xff09;文本标记语言&#xff0c;是用于描述网页文档的一种标记语言. HTML 是用来描述网页的一种语言。 HTML 指的是超文本标记语言 (Hyper Text Markup Language) .HTML 不是一种编程语言&#xff0c;…

dubbo与springmvc的简单使用

什么是Dubbo&#xff1f; dubbo是阿里巴巴公司开源的高性能优秀服务框架&#xff0c;通过高性能的RPC&#xff08;远程服务调用&#xff09;实现服务的输入输出功能&#xff0c;可以与spring框架无缝整合&#xff1b; 传统的架构所有的模块都在一台服务器上&#xff0c;单台服务…

怎么用VC编程实现把用户名,密码提交到网页上并且实现登录?

网址&#xff1a;http://topic.csdn.net/u/20100526/11/d8ce2c65-a151-44d0-ae57-3847a1f01cfd.html 相关链接&#xff1a;VC POST表单——登录验证新浪邮箱VC提交网页表单&#xff0d;自动评论留言

一个计算机硕士毕业生的求职经验(二)

二、 前期准备 前期准备主要包括两个方面&#xff1a;实习和简历。一般10月份开始找的话&#xff0c;最好1、2月份准备&#xff0c;也就是说提前半年&#xff0c;我是4月份开始作的准备。当时准备的主要内容就是&#xff1a;确定自己的求职目标&#xff0c;写好简历&#x…

Mina学习之搭建项目工程目录

为什么80%的码农都做不了架构师&#xff1f;>>> Mina核心分层分为&#xff1a;IoService,IoFilter和IoHandler 搭建项目工程目录&#xff0c;一般应用都包含如下几个部分&#xff1a; 1、server\client 创建mina连接&#xff0c;TCP/IP请求响应模式 …

测试自动化学习7

python读取Excel import xlrdbook xlrd.open_workbook(my_user-bak.xls) sheet book.sheet_by_index(0) print(sheet.row_values(0)) # 某一行数据 print(sheet.col_values(0)) # 某一列数据 print(sheet.cell(0,0).value) # 某个单元格的数据 print(sheet.cell(1,2).valu…

The credentials you provided during SQL Server 2008 install are invalid

在安装sql server的时候遇到了这个问题&#xff0c; - The credentials you provided for the SQL Server Agent service are invalid. To continue, provide a valid account and password for the SQL Server Agent service.- The specified credentials for the SQL Server …

2010全面兼容IE6/IE7/IE8/FF的CSS HACK写法

这个帖子总结的很好。http://www.aa25.cn/web_w3c/868.shtml转载于:https://www.cnblogs.com/dqg0312/archive/2011/08/03/2126050.html

jsp 连接MS server 数据库的例子

先要把JBCD引擎加到工程里面来&#xff01; <% page import"java.lang.*, java.io.*, java.sql.*, java.util.*" contentType"text/html;charsetgb2312" %> <html> <body> <% Class.forName("com.microsoft.sqlserver.jdbc.SQLS…

HttpClient中转上传文件

原文&#xff1a;https://www.cnblogs.com/lyxy/p/5629151.html 场景&#xff1a;客户端(浏览器)A---->选择文件上传---->服务器B---->中转文件---->服务器C---->返回结果---->服务器B---->客户端A 有时候在项目中需要把上传的文件中转到第三方服务器&…

sublime text 2快捷键总结

为什么80%的码农都做不了架构师&#xff1f;>>> 以mac系统为例 一&#xff1a;编辑&#xff08;我们使用一个编辑器最频繁的事情就是编辑了。&#xff09; &#xff08;1&#xff09;基本操作&#xff1a; 【1】CommandA:全选 【2】CommandC:复制 【3】Comman…

Unix环境高级编程学习笔记(五)

第七章 进程环境1、main函数&#xff1a;int main(int argc, char *argv[]) 2、进程中止&#xff1a;正常中止&#xff1a;(1)从main返回;(2)调用exit;(3)调用_exit或_Exit;(4)最后一个线程从启动例程返回;(5)最后一个线程调用pthread_exit; 异常中止&#xff1a;(6)调用abort;…

Spring Boot 2.1.5 正式发布,1.5.x 即将结束使命!

Spring Boot 官网在 2019/03/15 这天发布了 Spring Boot 2.1.5 正式版&#xff0c;栈长表示真跟不上了。。 官宣如下 &#xff1a; https://spring.io/blog/2019/05/15/spring-boot-2-1-5-released 仓库也已经跟上&#xff1a; 那这个版本有什么新功能&#xff1f; 1、增加了 S…

linux上安装telnet服务器:linux vmvare虚拟机 安装telnet redhat9

linux上安装telnet服务器:linux vmvare虚拟机 安装telnet redhat9 参考&#xff1a;http://blog.sina.com.cn/s/blog_5688414b0100bhr9.html ------------------------------------------------------------------------------------------- 1、检测 安装之前先检测是否这些软件…

Console-算法[for,if]-有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数...

ylbtech-Arithmetic:Console-算法[for,if]-有5个人坐在一起&#xff0c;问第五个人多少岁&#xff1f;他说比第4个人大2岁。问第4个人岁数1.A&#xff0c;Demo(案例)【程序28】 题目&#xff1a;有5个人坐在一起&#xff0c;问第五个人多少岁&#xff1f;他说比第4个人大2岁。问…

gunicorn 几种 worker class 性能测试比较

Gunicorn, 一个支持WSGI协议的web服务器 Flask, 一个轻量级的python web框架 Gunicorn目前自带支持几种工作方式:sync (默认值) eventlet gevent tornado 测试环境准备 python 2.7 redis-server 2.8.4 压力测试工具ab 代码及相关python包准备 创建虚一个新的虚拟环境并安装需要…

《孙子兵法》【作战第二】

原文&#xff1a;&#xff11;.孙子曰&#xff1a;凡用兵之法&#xff0c;驰车千驷&#xff0c;革车千乘&#xff0c;带甲十万&#xff0c;千里馈粮&#xff0c;则内外之费&#xff0c;宾客之用&#xff0c;胶漆之材&#xff0c;车甲之奉&#xff0c;日费千金&#xff0c;然后十…

linux下ftp服务器的搭建

http://www.cublog.cn/u3/93926/showart_1874130.htmlRHEL4中ftp服务器的搭建首先修改配置文件使主机获得永久ip地址# vi /etc/sysconfig/network-scripts/ifcfg-eth0DEVICEeth0BOOTPROTOstaticIPADDR172.16.16.111NETMASK255.255.0.0GATEWAY172.16.16.1ONBOOTyesTYPEEthernet重…