C#中带递推关系的序列实现问题(第7题)
第7题

序列类问题通用切入方法(完全适配你目前只会for、while循环的知识储备,不用额外学新语法)
- 先手动算小样例找规律:别着急写代码,先在草稿纸上手动算出序列前5~10项的结果,把每一步的数值变化列清楚,先搞明白序列本身的生成规则。
- 找递推关系:观察当前项的值,和它前面1项、2项有没有固定的计算逻辑。你之前学的变量交换法,本质就是缓存前面已经算过的结果,避免重复计算,是解这类递推序列题最高效的思路,完全够用。
- 定准初始值:递推的起点不能错,比如很多序列前1项、前2项是固定值,先把循环启动前的变量初始值设对,再写循环内部的数值更新逻辑,控制循环跑到要求的项数即可。
- 小步验证:写完逻辑先拿前3、4项的结果和你手动算的做对比,对不上就逐轮打印变量值找问题。这类题90%的错误都是变量更新顺序写反了——提前把后面要用到的旧值存在临时变量里,再做更新,别直接覆盖旧值。
常见写法错误参考
很多人用变量交换法写不对题,都是循环里的更新顺序错了,拿最经典的斐波那契数列举个正确写法的例子,你可以对照排查自己之前的逻辑问题:
# 需求:求斐波那契数列第n项,数列规则:前两项为1、1,后续每一项等于前两项之和 n = 10 # 举例求第10项 if n <= 2: print(1) else: prev_prev = 1 # 存当前位置往前数第2项的值 prev = 1 # 存当前位置往前数第1项的值 for i in range(3, n+1): # 第一步先算当前项的值,这时候不能改prev_prev和prev,不然旧值会被覆盖 current = prev_prev + prev # 往后挪一位:原来的前1项变成下一轮的前2项 prev_prev = prev # 刚算的当前项变成下一轮的前1项 prev = current print(prev)
你自己写题的时候如果卡壳,就把循环每一轮的变量值都打印出来,和你手动算的结果逐行对,哪一步数值不对问题就在哪,很容易定位。
内容的提问来源于stack exchange,提问作者Elie Makdissi
相关产品推荐
相关产品推荐

