Python入门程序【六】

程序员之所以犯错误,不是因为他们不懂,而是因为他们自以为什么都懂。


# 函数定义和默认参数
def func(x, y = 500):
    print(x, y)

func(150)
func(100, 200)
func(y = 300, x = 100)

# 可变参数
def func(name, *numbers):
    print(name)
    print(numbers)

func('Tom', 1, 2, 3, 4)

# 关键字参数
def func(name, **kvs):
    print(name)
    print(kvs)

func('Jack', china = 'Beijing', uk = 'London')

# 命名关键字参数
def func(*, china, uk): # *用于和普通参数做分割,*args一样效果
    print(china, uk)

func(china = 'Beijing', uk = 'London')  # 必须传入参数名

# 复杂情况
def func(a, b, c = 0, *args, **kvs):
    print(a, b, c, args, kvs)

func(1, 2)
func(1, 2, 3)
func(1, 2, 3, 'a', 'b')
func(1, 2, 3, 'a', 'b', china = 'Beijing', uk = 'London')
func(1, 2, 3, *('a', 'b'), **{'china':'Beijing', 'uk':'London'})

# 递归的经典例子!
def fib(n):
    if n < 1:
        raise ValueError
    elif (n == 1) or (n == 2):
        return 1
    else:
        return fib(n - 1) + fib(n - 2)

print(fib(1))
print(fib(2))
print(fib(3))
print(fib(4))
print(fib(5))
print(fib(6))

 结果 :

150 500
100 200
100 300
Tom
(1, 2, 3, 4)
Jack
{'china': 'Beijing', 'uk': 'London'}
Beijing London
1 2 0 () {}
1 2 3 () {}
1 2 3 ('a', 'b') {}
1 2 3 ('a', 'b') {'china': 'Beijing', 'uk': 'London'}
1 2 3 ('a', 'b') {'china': 'Beijing', 'uk': 'London'}
1
1
2
3
5
8

写的是一些传参数要注意的地方和一个递归的经典案例,也是求斐波那契数列的

def move(n, source, target, helper):
    if n == 1:
        print (source + ' -> ' + target)
    else:
        move(n - 1, source, helper, target)
        print(source + ' -> ' + target)
        move(n - 1, helper, target, source)

move(4, 'A', 'B', 'C')

结果 :

A -> C
A -> B
C -> B
A -> C
B -> A
B -> C
A -> C
A -> B
C -> B
C -> A
B -> A
C -> B
A -> C
A -> B
C -> B

不知道大家玩没玩过汉诺塔,这是一个汉诺塔的程序,传进去数字多少就会进行多少块的移动

汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。

思路

假设3根柱子分别为A、B、C,圆盘数目为n。

1:如果A有一个圆盘,则直接移动至c。

2:如果A有2个圆盘,则A->B,A->C,B->C。

好了这个时候已经可以解决问题了,结束条件为 n==1;

假设当我们在数目为n-1的时候已经解决了移动问题可以成功移动至C,如果又多了一个呢,即n,我们用同样的方法把圆盘移动至B(我们已经可以把n-1个盘子通过B移动至C了,那么通过C移动至B也一样),为什么移动至B了呢,因为多了个盘子(放在最底部的大盘子),我们要向步骤2一样把上面的n-1个盘子看成一个整体,用上一个方法即移动n-1个盘子的方法把上面的n-1个盘子移动至B,然后把新增的那个大盘子移动至C,然后再用移动n-1个盘子对应的方法把B中的n-1个盘子移动至C,就完成了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

幽蓝丶流月

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

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

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

打赏作者

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

抵扣说明:

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

余额充值