不,我认为你是对的,它是递归的。它似乎是斐波那契数列的变体,一个经典的递归问题
请记住,递归算法有两个部分:
- 基本情况
- 递归调用
基本情况指定了您不能再递归的点。例如,如果您正在递归排序,则基本情况是长度为 1 的列表(因为单个项目是简单排序的)。
所以(假设 n 不是负数),你有 2 个基本情况:n = 0 和 n = 1。如果你的函数接收到一个等于 0 或 1 的 n 值,那么递归就没有意义了
考虑到这一点,您的代码应如下所示:
function f(int n):
#check for base case
#if not the base case, perform recursion
所以让我们以斐波那契为例。
在斐波那契数列中,每个数字都是它之前的 2 个数字的总和。因此,给定序列1, 2
,下一个数字显然是,1 + 2 = 3
之后的数字是2 + 3 = 5
,3 + 5 = 8
依此类推。通俗地说,第 n 个斐波纳契数是第 (n - 1) 个斐波纳契数加上第 (n - 2) 个斐波纳契数,或f(n) = f(n - 1) + f(n - 2)
但是序列从哪里开始呢?这是基本情况。斐波那契将他的序列定义为从 开始1, 1
。这意味着,对于我们的目的,f(0) = f(1) = 1
. 所以...
function fibonacci(int n):
if n == 0 or n == 1:
#for any n less than 2
return 1
elif n >= 2:
#for any n 2 or greater
return fibonacci(n-1) + fibonacci(n-2)
else:
#this must n < 0
#throw some error
请注意,斐波那契与递归一起被教授的原因之一是因为它表明有时递归是一个坏主意。我不会在这里讨论它,但是对于大 n 这种递归方法非常低效。另一种方法是有2个全局变量,n1
这样n2
......
n1 = 1
n2 = 1
print n1
print n2
loop:
n = n1 + n2
n2 = n1
n1 = n
print n
将打印序列。