求质因子
题目:输入一个正整数,按照从小到大的顺序输出它的所有质因子(重复的也要列举,如180的质因子为2 2 3 3 5 )
递归拆解:
1 | """ |
特别解法:
1 | """ |
用循环替代递归:
1 | from __future__ import print_function |
动态规划
题目:购物单问题
如果要买归类为附件的物品,必须先买该附件所属的主件;
每个主件可以有 0 个、 1 个或 2 个附件;
附件不再有从属于自己的附件;
每件物品规定了一个重要度,分为 5 等:用整数 1 ~ 5 表示,第 5 等最重要;
每件物品的价格都是10元的整数倍;
希望在不超过 N 元(可以等于 N 元)的前提下,使每件物品的价格与重要度的乘积的总和最大。
求这个最大值。
参考解法:
1 | """ |
走方格
题目:计算n*m的棋盘格子(n为横向的格子数,m为竖向的格子数,m<=8)从棋盘左上角出发沿着边缘线从左上角走到右下角,总共有多少种走法,要求不能走回头路,即:只能往右和往下走,不能往左和往上走。
注:沿棋盘格之间的边缘线行走
递归法:
1 | def p_mn(m, n): |
公式法(阶乘):
1 | from math import factorial as f |
如果不知道从math导入,可自定义阶乘函数:
1 | def factorial(n): |
如何证明可以按这个公式?看起来像是排列组合或概率统计的问题。
f(n+m)是既不考虑顺序,又不考虑方向的排列数,f(m)和f(n)分别是竖向、横向不考虑顺序的排列数。