python初始递归2

题目链接

  1. 简单兔子
  2. 分解质因子
  3. 八进制
  4. 爬楼梯游戏

简单兔子

题目如下:
有一只兔子,从出生后第2个月起每个月都生只兔子,小兔子长到第2个月后每个月又生一只兔子,假如兔子都不死,问每个月的兔子总数为多少?
对于这道问题,可以自己模拟6个月或其他月份来解决。
在这里插入图片描述
我们从图中可以发现,当前月的兔子数目等于上个月的兔子数目,加上上个月的兔子数目,因为他们会生小兔子。所以就是斐波那契数列。
递推代码如下:

m = int(input())
a,b = 1,1
if m == 1 or m==2:
    print(a)
else:
    for i in range(m-2):
        a,b = b,a+b
    print(b)

递归代码如下:

def f(n):
    if n == 1 or n==2:
        return 1
    return f(n-1)+f(n-2)
n = int(input())
print(f(n))

记忆化思想递归代码如下:

def f(n):
    if q[n] != -1:
        return q[n]
    t = f(n-1)+f(n-2)
    q[n] = t
    return t
    
n = int(input())
q = [-1]*(n+1)
q[1],q[2]=1,1
print(f(n))

分解质因子

首先求质因子,C++方法如下:

# include<iostream>
using namespace std;
bool first = true;
void zyz(int n, int p){
    if(n>1){
        if(n%p==0){
            if(first){
                cout<<p;
                first=false;
            }
            else cout<<" "<<p;
            zyz(n/p,p);
        }
        else zyz(n,p+1);
    }
}
int main(){
    int n;
    cin>>n;
    zyz(n,2);
    cout<<endl;
}

参照C++,可写python如下:

def f(n,p):
    if n>1:
        if n%p == 0:
            res.append(p)
            f(n//p,p)
        else:
            f(n,p+1)
n = int(input())
res = []
f(n,2)
print(res)

上面代码求解小数的质因子是可以的,但是不知道为何求大数就不行了?希望看到的家人们可以为我解答一下。
上面那道题的代码如下,没有用递归

from math import sqrt
n = int(input())
print(f'{n}=',end='')
f = False
for v in range(2,int(sqrt(n))+1):
    c = 0
    while n%v == 0:
        c += 1
        n //=v
    if c>1 and not f:
        print(f'{v}^{c}',end='')
        f = True
    elif c==1 and not f:
        print(f'{v}',end='')
        f = True
    elif c>1 and f:
        print(f'*{v}^{c}',end='')
    elif c==1 and f:
        print(f'*{v}',end='')
if n>1 and f:
    print(f'*{n}',end='')
elif n>=1 and not f:
    print(f'{n}',end='')

八进制

不用递归的简单python代码如下:

while 1:
    try:
        n = int(input())
    except:
        break
    print(oct(n)[2:])

用递归代码如下:

def f(n):
    if n<8:
        return n
    return f(n//8)*10+n%8
while 1:
    try:
        n = int(input())
        print(f(n))
    except:
        break

爬楼梯游戏

主要思想:递归,最后一步是1级还是2级。
由于题目数据量到10的18,不能用递归

def f(n):
    if n==1:
        return 1
    elif n==2:
        return 2
    return f(n-1)+f(n-2)
n = int(input())
print(f(n))

递归方法2:

def dsf(s):
    global ans
    if s > n:
        return 
    if s == n:
        ans += 1
    dsf(s+1)
    dsf(s+2)
n = int(input())
ans = 0
dsf(0)
print(ans)

可以用矩阵幂解决

def multi(matrix_a,matrix_b,MOD):
    matrix_result = [[0 for _ in range(len(matrix_b[0]))] for _ in range(len(matrix_a))]
    for i in range(len(matrix_a)):
        for j in range(len(matrix_b[0])):
            for k in range(len(matrix_b)):
                matrix_result[i][j] += (matrix_a[i][k]*matrix_b[k][j]) % MOD
    return matrix_result

def quick_multi(matrix,m,MOD):
    res = [[1, 0], [0, 1]]
    while m:
        if m & 1:
            res = multi(res, matrix, MOD)
        matrix = multi(matrix, matrix, MOD)
        m = m>>1
    return res

MOD = 1000000007
N = int(input())
if N < 3:
    print([0, 1, 2][N])
else:
    M12 = [[1,2]]
    matrix = [[0, 1], [1, 1]]
    res = multi(M12, quick_multi(matrix, N-2, MOD), MOD)
    print(res[0][-1] % MOD)
  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

peanut666888

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值