python 函数编写及5个递归函数经典问题与解析

博客围绕Python开发语言,着重介绍了函数练习与递归的应用。通过经典的阶乘问题、斐波那契数列、汉诺塔挑战等实例,阐述了递归的原理和使用方法,还提及计算列表长度和检查回文词等递归小技巧,展现了递归在解决问题中的强大作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、函数练习 

#过程:就是没有返回值的函数
def test01():
    msg = 'hello The little green frog'
    print(msg)

def test02():
    msg = 'hello WuDaLang'
    print(msg)
    return msg

def test03():
    msg = 'hello WuDaLang'
    print(msg)
    return msg, (1,2,3), {"name":"ly"}

t1 = test01()
t2 = test02()
t3 = test03()
print(t1)
print(t2)
print(t3)  #实际上只返回一个值,就一个元组

"""
总结:
返回值数=0;返回None
返回值数=1;返回object
返回值数>1;返回tuple
"""

def calc(x,y):    # 形参
    res = x**y
    return res
c = calc(2,3)    #实参
print(c)
a = 10
b = 10
d= calc(a,b)
print(d)

def test(x,y,z):
    print(x)
    print(y)
    print(z)

test(1,2,3)     #位置参数
test(x=1,y=3,z=2)       #关键字参数
test(1,3,z=2)       #位置参数必须在关键字参数左边

def handle(x,type='mysql'):
    print(x)
    print(type)

handle('hello')
handle('hello',type='sqllite')
handle('hello','sqllite')

#参数组**字典  *列表
def test(x,*args):
    print(x)
    print(args)
    print(args[0])

test(1,2,3,4,5,6)
test(1,{'name':'alex'})
test(1,[x,y,z])
test(1,*[x,y,z])      #遍历一遍

def test(x,**kwargs):
    print(x)
    print(kwargs)

test(1,y=2,z=3)   # 字典

# 一起使用,*args必须在前面,不能违背大原则
def test(x,*args,**kwargs):
    print(x)
    print(args)
    print(kwargs)

test(1,2,k=2)

def test(x,*args,**kwargs):
    print(x)
    print(args,args[-1])
    print(kwargs,kwargs.get('y'))  # 字典获取元素

test(1,1,2,1,1,11,x=1,y=2,z=3) # 报错
test(1,1,1,2,4,11,y=2,z=3)
test(1,*[1,2,3],**{'y':1})

二、递归的艺术

1. 经典的阶乘问题

def factorial(n):
    if n == 0:
        return 1
    else:
        return n * factorial(n-1)
        return n * factorial(n-1)
  • 魔法解析:阶乘就是所有小于及等于该数的正整数的乘积。这个函数说:“我算n的阶乘,就是n乘以(n-1)的阶乘。”直到n=0,它才说:“哦,1!”这就是递归的终止条件。

2. 斐波那契数列

def fibonacci(n):
    if n <= 0:
        print("输入错误")
    elif n == 1:
        return 0
    elif n == 2:
        return 1
    else:
        return fibonacci(n-1) + fibonacci(n-2)
  • 解密:斐波那契数列,每一项都是前两项之和,看起来是不是很像“我叫你,你叫他,我们三个一起玩”?

3. 汉诺塔挑战

def hanoi(n, source, target, auxiliary):
    if n == 1:
        print(f"将盘子从 {source} 移到 {target}")
    else:
        hanoi(n-1, source, auxiliary, target)
        print(f"将盘子从 {source} 移到 {target}")
        hanoi(n-1, auxiliary, target, source)
  • 游戏规则:汉诺塔是个古老的游戏,用递归解决,就像是指挥小精灵按步骤搬家,一步步解决大问题。

4. 计算列表长度

def list_length(lst):
    if lst == []:
        return 0
    else:
        return 1 + list_length(lst[1:])
  • 小技巧:空列表的长度是0,其他的就加上第一个元素后剩余部分的长度。简单吧?

5. 检查回文词Palindrome

def is_palindrome(s):
    if len(s) < 2 or s[0] == s[-1]:
        return len(s) == 1 or is_palindrome(s[1:-1])
    else:
        return False
  • 镜像效应:这个词正读反读都一样?递归帮你一探究竟,逐层剥开字符的外衣。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值