编程问题与算法实现详解

109、模运算符有哪些用途?

模运算符常用于判断奇偶性、循环索引、时间计算等场景。

110、以下程序的输出是什么?绘制一个栈图,展示程序打印结果时的状态。程序为:定义递归函数recurse,接收参数n和s,若n等于0则打印s,否则递归调用recurse(n - 1, n + s),最后调用recurse(3, 0)。

程序输出为6。

栈图绘制方式:

  • 每个函数调用用一个框表示。
  • 框外写函数名 recurse ,框内写参数 n s 的值。
栈帧(从下往上):
  1. 第一个框 n = 0 , s = 6
  2. 第二个框 n = 1 , s = 5
  3. 第三个框 n = 2 , s = 3
  4. 最上面框 n = 3 , s = 0

框之间用连线表示调用关系。

111、什么是科赫曲线?并说明绘制长度为x的科赫曲线的步骤。

科赫曲线定义

绘制长度为 $ x $ 的科赫曲线步骤:

  1. 绘制长度为 $ \frac{x}{3} $ 的科赫曲线;
  2. 左转 60 度;
  3. 绘制长度为 $ \frac{x}{3} $ 的科赫曲线;
  4. 右转 120 度;
  5. 绘制长度为 $ \frac{x}{3} $ 的科赫曲线;
  6. 左转 60 度;
  7. 绘制长度为 $ \frac{x}{3} $ 的科赫曲线。

若 $ x < 5 $,则直接画长度为 $ x $ 的直线。

112、编写一个名为koch的函数,该函数接受参数x并绘制指定长度的科赫曲线。

科赫曲线绘制规则

科赫曲线绘制规则如下:

若 $ x < 5 $,直接绘制长度为 $ x $ 的直线;

若 $ x \geq 5 $,按以下步骤绘制:

  1. 绘制长度为 $ x/3 $ 的科赫曲线;
  2. 左转 60 度;
  3. 绘制长度为 $ x/3 $ 的科赫曲线;
  4. 右转 120 度;
  5. 绘制长度为 $ x/3 $ 的科赫曲线;
  6. 左转 60 度;
  7. 绘制长度为 $ x/3 $ 的科赫曲线。

Python 实现代码

from jupyturtle import forward, left, right, back

def koch(x):
    if x < 5:
        forward(x)
    else:
        koch(x/3)
        left(60)
        koch(x/3)
        right(120)
        koch(x/3)
        left(60)
        koch(x/3)

使用时可调用 make_turtle(delay=0) koch(120) 来绘制科赫曲线。

113、阿克曼函数A(m, n)定义如下:当m = 0时,A(m, n) = n + 1;当m > 0且n = 0时,A(m, n) = A(m - 1, 1);当m > 0且n > 0时,A(m, n) = A(m - 1, A(m, n - 1))。编写一个名为ackermann的函数来计算阿克曼函数。调用ackermann(5, 5)会发生什么?

代码可写为:

def ackermann(m, n):
    if m == 0:
        return n + 1
    elif m > 0 and n == 0:
        return ackermann(m - 1, 1)
    elif m > 0 and n > 0:
        return ackermann(m - 1, ackermann(m, n - 1))

调用 ackermann(5, 5) 时,因阿克曼函数增长极快,可能会导致栈溢出错误或程序运行极长时间。

114、已知函数 uses_any,它接受两个字符串并检查第一个字符串是否使用了第二个字符串中的任何字母。编写函数 uses_all,该函数接受两个字符串并检查第一个字符串是否使用了第二个字符串中的所有字母,允许重复使用字母。

def uses_all(word, required):
    for letter in required:
        if not uses_any(word, letter):
            return False
    return True

115、作为练习,将访问字符串值、使用字符串处理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值