零基础入门学习Python22-递归2 斐波那契数列和汉诺塔

数学函数

F(n) = 1 n = 1
F(n) = 1 n = 2
F(n) = F(n-1)+F(n-2) n > 2

问n=20时,F(n)的值是多少???

迭代实现

def F(n):
    x = 1
    y = 1
    if n < 1:
        print('输入错误')
    while n > 2:
        z = x + y
        x = y
        y = z
        n = n - 1#循环数减一
    return z

在这里插入图片描述

递归实现

def F(n):
	if n < 1:
		print('输入错误')
	elif n == 1 or n == 2:
		return 1
	else:
		return F(n-1) + F(n-2)

在这里插入图片描述

分析

分治思想:将复杂问题分解为多个简单问题
递归逻辑很简单,直接把所想的东西写成代码就是递归算法
用迭代代码来实现基本是毫秒级别的,而用递归来实现就考验你的CPU能力了
递归要正确使用

汉诺塔递归实现

def hanoi(n, x, y, z):#n为盘子个数,x为原来的柱子,z为最后移动到的位置
    if n == 1:
        print(x, '-->', z)
    else:
        hanoi(n-1,x,z,y)#将前n-1个盘子从x移动到y上
        print(x,'-->',z)#将最底下的最后一个盘子从x移动到z上
        hanoi(n-1,y,x,z)#将y上的n-1个盘子移动到z上
        
n = int(input("请输入汉诺塔的层数:"))
hanoi(n,'X','Y','Z')

在这里插入图片描述

Task

0. 使用递归编写一个十进制转换为二进制的函数(要求采用“取2取余”的方式,结果与调用bin()一样返回字符串形式)。
小甲鱼代码

def Dec2Bin(dec):
    result = ''
    
    if dec:
        result = Dec2Bin(dec//2)
        return result + str(dec%2)
    else:
        return result

print(Dec2Bin(62))

我的代码

def mybin(n):
    c = ''
    if n == 0:
        return c
    while n >= 1:
        b = n // 2
        a = n % 2#二进制的最后一位
        c = str(mybin(b))#用整除数再求二进制
        return c + str(a)
        n = b

在这里插入图片描述
在这里插入图片描述

1. 写一个函数get_digits(n),将参数n分解出每个位的数字并按顺序存放到列表中。举例:get_digits(12345) ==> [1, 2, 3, 4, 5]
小甲鱼代码

result = []
def get_digits(n):
        if n > 0:
                result.insert(0, n%10)
                get_digits(n//10)

我的代码

result = []#放外面合适,不然每次执行都会归为空列表
def get_digits(n):
    if n > 0:#用while执行不出结果,因为n除以10永远都大于0
        a = n // 10
        b = n % 10#个位数
        result.append(b)
        get_digits(a)
    return list(reversed(result))

在这里插入图片描述

***2. 还记得求回文字符串那道题吗?现在让你使用递归的方式来求解,亲还能骄傲的说我可以吗?***。。。。。。。。。。
在这里插入图片描述
小甲鱼代码

def is_palindrome(n, start, end):
        if start > end:
                return 1     
        else:
                return is_palindrome(n, start+1, end-1) if n[start] == n[end] else 0
        
string = input('请输入一串字符串:')
length = len(string)-1

if is_palindrome(string, 0, length):
        print('"%s"是回文字符串!' % string)
else:
        print('"%s"不是回文字符串!' % string)

3. 使用递归编程求解以下问题:
有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。问第三个人,又说比第2人大两岁。问第2个人,说比第一个人大两岁。最后问第一个人,他说是10岁。请问第五个人多大?

我的代码:

def age(n):
    if n == 1:
        return 10
    if n > 1:
        return 2 + age(n - 1)

在这里插入图片描述
小甲鱼代码:

def age(n):
    if n == 1:
        return 10
    else:
        return age(n-1) + 2
        
print('哈哈,我知道了,第五个人的年龄是 %d 岁,啵啵脆!' % age(5))

猜你喜欢

转载自blog.csdn.net/qq_44520665/article/details/114780415
今日推荐