生活随笔
收集整理的這篇文章主要介紹了
跳格子的问题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
常見的一個經典問題:
從格子外面朝著格子里面跳,請問假定如果每次只能跳一個格子或者兩個格子,跳到第八個格子有多少種不同的跳法?
數學的想法
這是一個關于數列的題,可以這樣去想一個存在遞歸的問題:
假如我要跳到第 nnn 個格子,那么就必須要在前一步跳到第 n?1n-1n?1 或者 n?2n-2n?2 個格子,如果說跳到第 nnn 個格子用的次數為 ana_nan? ,那么 an=an?1+an?2a_n = a_{n-1}+ a_{n-2}an?=an?1?+an?2?。
注意,在這個地方有一個理解問題,為什么在等式的右側沒有系數:盡管 n?2n-2n?2 能夠通過移動一個格子移動到 n?1n-1n?1 的位置,但是這樣會導致計算的重復性,因此前面不加系數,直接可以默認為從 n?2n-2n?2 個格子是跳一次移動兩個格子到 nnn 的這個位置。
那么,根據這樣的想法,去求解這個數學問題就很簡答了,就直接是斐波那契數列了:對于前面的跳格子的跳法進行計算,后面的就可以根據前面兩項進行求和計算。
格子數12345678910
| 跳法 | 1 | 2 | 3 | 5 | 8 | 13 | 21 | 34 | 55 | 89 |
當然,如果是步長設置最長為3,那么就相當于這個項的前面三項的值進行求和即可
格子數12345678910
| 跳法 | 1 | 2 | 4 | 7 | 13 | 24 | 44 | 81 | 149 | 274 |
以此類推,后面的格子可以根據前面的格子跳法來求和進行計算。
代碼
運用代碼來寫遞歸的方式同樣可以計算
python代碼如下 代碼片:
def get_num(i
):k
= input('請輸入{}(若希望終止請輸入 \'False\') :'.format(i
))k
= k
.upper
()if k
== 'FALSE':return Falsetry:k
=float(k
)except ValueError
as reason
:print('輸入有誤,請輸入整數值:')return get_num
()if k
==int(k
):k
=int(k
)return k
else:print('輸入有誤,您輸入的數值為浮點數,請輸入整數值')return get_num
()def get_point():point
= {}point_name
= ['終點','最大步長']for i
in point_name
:point
[i
] = get_num
(i
)if point
[i
] is False:return Falsereturn point
def num_count(begin_point
,end_point
,max_step
):if begin_point
>end_point
:return 0if begin_point
==end_point
:return 1else:return sum([num_count
(begin_point
+1+i
,end_point
,max_step
) for i
in range(max_step
)])if __name__
=='__main__':point
= get_point
()if point
is False:print('輸入的內容有誤,程序已經終止')else:end_point
= point
['終點']max_depth
= point
['最大步長']begin_point
= 0num
= num_count
(begin_point
,end_point
,max_depth
)a
='='*50print('\n',a
,end
='\n\n')print('起始點為:{}\n終點為:{}\n最大步長為:{}'.format(begin_point
,end_point
,max_depth
))print('所走的總的不同選擇有 {} 種'.format(num
))
總結
以上是生活随笔為你收集整理的跳格子的问题的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。