实验题1:高效求解xⁿ 目的:掌握基本递归算法设计。 内容:编写程序exp5-1.py,采用递归高效求解xⁿ问题,要求最多使用log2ⁿ次递归调用。
时间: 2023-06-29 17:09:51 浏览: 80
以下是exp5-1.py的代码实现:
```python
def power(x, n):
if n == 0:
return 1
elif n % 2 == 0:
t = power(x, n // 2)
return t * t
else:
t = power(x, (n - 1) // 2)
return x * t * t
x = float(input("请输入底数 x:"))
n = int(input("请输入指数 n:"))
result = power(x, n)
print(f"{x} 的 {n} 次方为:{result}")
```
我们采用了分治的思想,如果n为偶数,则将xⁿ拆分为(xⁿ/2)²,如果n为奇数,则将xⁿ拆分为x * (xⁿ-1/2)²。通过这种方式,每次递归调用可以将指数缩小一半,最终实现了最多使用log2ⁿ次递归调用的要求。
例如,当输入底数为2,指数为10时,程序的输出为:
```
请输入底数 x:2
请输入指数 n:10
2.0 的 10 次方为:1024.0
```
当输入底数为3,指数为5时,程序的输出为:
```
请输入底数 x:3
请输入指数 n:5
3.0 的 5 次方为:243.0
```
相关问题
高效求解xn 目的:掌握基本递归算法设计。 内容:编写程序exp5-1.py,采用递归高效求解xn问题,要求最多使用log2n次递归调用。
下面是一个递归高效求解 $x^n$ 的 Python 代码,最多使用 log2n 次递归调用:
```python
def fast_pow(x, n):
if n == 0:
return 1
elif n == 1:
return x
elif n % 2 == 0:
return fast_pow(x * x, n // 2)
else:
return x * fast_pow(x * x, (n - 1) // 2)
```
代码中用到了二分法的思想,将 $x^n$ 分解为 $(x^2)^{\frac{n}{2}}$,这样每次递归调用时,指数都会减半。当指数为偶数时,直接将底数平方并继续递归;当指数为奇数时,先递归计算 $(x^2)^{\frac{n-1}{2}}$,再将其乘以 $x$,即可得到 $x^n$ 的值。这样,递归调用的次数就只有 log2n 次了。
实验题2:用递归算法求单链表中倒数第K个结点。 目的:深入掌握单链表递归算法设计方法。 内容:编写一个程序exp5-2.py,用递归求解单链表中倒数第K个结点.
好的,下面是我的代码实现:
```python
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
def find_kth_node(head: ListNode, k: int) -> ListNode:
if k <= 0 or not head:
return None
fast = slow = head
for _ in range(k):
if not fast:
return None
fast = fast.next
while fast:
fast = fast.next
slow = slow.next
return slow
```
代码思路如下:
1. 首先检查 k 是否小于等于 0 或者 head 是否为空,如果是,返回 None。
2. 定义两个指针 fast 和 slow,让 fast 先走 k 步,然后 slow 和 fast 同时移动,直到 fast 到达链表末尾。
3. 返回 slow。
这里使用了快慢指针的思想,时间复杂度为 O(n)。