一对兔子,从出生后第3个月起每个月都生一对兔子。小兔子长到第3个月后每个月又生一对兔子。假如兔子都不死,请问第1个月出生的一对兔子,第n个月有多少只兔子?

变量拆分法

通常的,对于这个问题,通常的求解方法是观察得出前两项和等于第三项,也就是斐波那契数列。但如果没有观察出这个结果,还有更直白的方式做这道题,如下

兔子总数按照性质拆分,分别分为:
A=出生了一个月兔子
B=出生了二个月兔子
C=成年兔子
兔子总数=A+B+C

不难发现,下一个月的
一月兔子=B+C(成年兔子生的)
二月兔子=A(本来一个月大的长成两个月大了)
成年兔子=B+C(已经成年的加上本来两个月大的长成的成年兔子)
兔子总数=上面三项的加和

表面上一步步推进的每月兔子数,事实上是它内部的变量(每种类型兔子是兔子总数的内部变量)按照一定的规律(上面写的下一个月的每种兔子的算法)进行自我更新(几个量进行一定计算后重新赋值给原来的每种兔子类型了)

对于这种重新赋值的情况,在代码上的做法可以是将原来的数据拷贝出来,进行计算后重新计算后填入,如下图:

\\A、B、C仍然是上面说过的意思
\\每个小写字母是大写字母数值的拷贝
int a=A,b=B,c=C;
A=b+c;
B=a;
C=b+c;
Sum=A+B+C;

那么对于我们要求的第n月兔子数,也就是Sum=A+B+C,用一个for循环就可以写出代码了。具体代码在文末。

总结:
1.对于一个变量,可以观察它能否拆分成“小项经过一定方式的运算”,这样解决问题的可能性会大一些,也会直接一些。
2.对于一些变量经过自身一些规律运算后自我更新的问题,可以先将其拷贝,用拷贝出来的数值运算后填入原来的变量里。

扩展:变量自我更新在递推数列中的应用

转回来讲,如果讲兔子问题用的是递推公式an+2=an+an+1来做,用变量更新来做:从开头开始,先把a3算出来,然后a,b,c分别表示a1,a2,a3,将a,b,c每个拷贝出一个备份copya,copyb,copyc,然后像上面一样给a,b,c重新赋值,重新赋值后每个变量表示的数列往后推一个,变成对应a2,a3,a4,以此类推。(其实这里的a用不上,可以不拷贝)

代码:

for(i=1;i<n;i++)
{copya=a;copyb=b;copyc=c;
a=copyb;
b=copyc;
c=copyb+copyc;}
printf("a[n]=%d",a);

总结:其实只要知道递推公式,无论那个递推式多么复杂,都可以用这种方法做。只需把相邻(不一定要严格相邻,像an=an-4+2an-2这种不完全是连在一起的递推公式也完全没问题,只要后来递推出来的那个值是唯一的就行了)看成一个整体,拷贝原变量,用拷贝出的数据进行一定运算后重新赋值给原变量就行了。每运算一次变量代表的a[i]变成a[i+1](也就是往后推一位)

文末附:变量拆分做法的代码

#include<stdio.h>
int main()
{
/*a=一个月大的兔子
b=两个月大的兔子
c=成年兔子
copya=a的拷贝
copyb=b的拷贝
copyc=c的拷贝
n=月份数
sum=每个月兔子总对数 */
int a=1,b=0,c=0,n=0,sum=0;
int copya,copyb,copyc;
printf("请输入月份数\n");
scanf("%d",&n);
int i;
for(i=1;i<=n;i++)
{copya=a,copyb=b;copyc=c;
a=copyb+copyc;
b=copya;
c=copyb+copyc;
}
sum=a+b+c;
printf("兔子总数为%d",sum);
return 0;
}

兔子的启示:变量拆分相关推荐

  1. python separator_在Python中使用分隔符变量拆分字符串

    regex解决方案(对我来说)似乎非常简单:import re def split_string(source,separators): return re.split('[{0}]'.format( ...

  2. python用变量输出abcd_python中星号变量的几种特殊用法

    一.什么是星号变量 最初,星号变量是用在函数的参数传递上的,在下面的实例中,单个星号代表这个位置接收任意多个非关键字参数,在函数的*b位置上将其转化成元组,而双星号代表这个位置接收任意多个关键字参数, ...

  3. python中星号变量的几种特殊用法

    在Python中星号除了用于乘法数值运算和幂运算外,还有一种特殊的用法"在变量前添加单个星号或两个星号",实现多参数的传入或变量的拆解,本文将详细介绍"星号参数" ...

  4. python中带*(单星号)的变量和**(双星号)的变量

    一.*args的使用方法 *args 用来将参数打包成tuple给函数体调用 二.**kwargs的使用方法 **kwargs 打包关键字参数成dict给函数体调用注意点:参数arg.*args.** ...

  5. python中特殊变量-python list每三个分成一组python中星号变量的几种特殊用法

    在Python中星号除了用于乘法数值运算和幂运算外,还有一种特殊的用法"在变量前添加单个星号或两个星号",实现多参数的传入或变量的拆解,本文将详细介绍"星号参数" ...

  6. SPSS(基础篇09)--拆分数据文件

    拆分数据文件 文章目录 拆分数据文件 前言 1. 在原始文件中拆分, 1.1 拆分文件--'比较组' 1.2. 拆分文件--'按组来组织输出' 1.3. 其它用法 2. 直接存储为多层(拆分结果单独存 ...

  7. MATLAB 基础知识 数据类型 表 添加、删除和重新排列表变量

    本文说明如何在表中添加.删除和重新排列列向变量.您可以使用 addvars.movevars 和 removevars 函数添加.移动和删除表变量.作为备选方法,您还可以使用圆点语法或对表进行索引来修 ...

  8. python双星号什么运算_Python:星号变量的用法(单、双星号)

    在Python中,星号除了用于乘法数值运算和幂运算外,还有一种特殊的用法"在变量前添加单个星号或两个星号",实现多参数的传入或变量的拆解,本文将详细介绍"星号参数&quo ...

  9. 【stata】变量处理、虚拟变量生成和样本分组的常见操作

    0. 变量导入 此处以美国1988年妇女工资(官方数据)为例进行演示,数据导入代码为: * - 数据清除 - clear all // 清除所有 cls // 清除屏幕* - 数据导入 - sysus ...

最新文章

  1. CAS无锁(乐观锁、自旋锁)优化
  2. github提交,却不显示提交记录
  3. PAT-Mars number
  4. JEECG 命名规范
  5. Python 爬虫-BeautifulSoup
  6. AngularJS日期格式化
  7. 操作系统1_进程控制块PCB
  8. 了解J1939协议和J1939数据记录仪(车辆工程机械中的黑匣子)
  9. 翁恺c语言程序设计入门作业,程序设计入门——C语言
  10. 禾川Q1系列PLC官方教程
  11. 当女程序员遇到了问题......太真实了
  12. 自然语言处理评测汇总(持续更新)
  13. 解决hadoop损失文件删除后出现DEPRECATED: Use of this script to execute hdfs command is deprecated.
  14. 《微信小程序》 开源项目
  15. 电信网络性能质量测量
  16. html浏览器在哪里,javascript在哪儿启用?
  17. 旋转向量与旋转矩阵的相互转化
  18. 使用NLTK做电影评论分析
  19. 华硕笔记本r414u怎么安装键盘_华硕R414U详细拆机装内存条步骤!
  20. 关于计算机专业的英语自荐信范文,计算机专业英语自荐信

热门文章

  1. 上传文件解决tomcat的临时目录失效问题
  2. C#查询MongoDB
  3. python 数组方法_Python 数组(Array)
  4. Fiddler手机抓包指南
  5. nacos配置mysql链接
  6. csv转为utf8编码_将utf-8编码的csv文件转换为gb2312编码的csv文件
  7. iPhone XS 能否经受的起寒冬的考验
  8. Windows XP操作系统试题~
  9. Android游戏开发十日通(6)- 太空大战
  10. 小米运动小米手环体验报告