这是问题:
编写一个尾递归函数,该函数将两个非负整数P和k作为输入,并输出具有初始人口P并每年将该人口乘以k的人口的前10年的列表。如果需要,您的函数可以具有辅助变量。
我试图获取代码以形成包含十个数字的列表。我假设数字的输入为10。我试图朝着使基本案例为空而不是0的方向发展。有人对如何修复此代码或使其更完善有任何建议吗?
(define (pop2 P k number)
(cond
[(= number 0) '()]
[else
(append (pop2 k (* P k)(- number 1)(list P)))]))
答案 0 :(得分:1)
如果在递归调用后无需执行任何操作,则递归函数定义为 tail-recursive 。但是pop2
在递归调用周围有append
!为确保该函数返回的值与递归调用返回的值完全相同,该函数使用函数的一个额外参数(累加器)来跟踪结果。
在递归调用中,参数与它们的相应含义不匹配,并且还存在一个额外的arg:
(pop2 k (* P k) (- number 1) (list P))
(pop2 P k number ???)
这可以帮助您入门:
;; pop2-acc : Nat Nat Nat [Listof Nat] -> [Listof Nat]
(define (pop2-acc P k number acc)
(cond
[(= number 0) <???>]
[else (pop2-acc P k (- number 1) <???>)]))
;; pop2 : Nat Nat Nat -> [Listof Nat]
;; initial-population (P), factor (k), years (number)
(define (pop2 P k number)
(pop2-acc P k number acc))
请注意,acc
是“到目前为止的结果”。可以将帮助程序pop2-acc
转换为pop2
中的局部函数,并且我们不必将k
传递到pop2-acc
中(因为它保持不变)。 / p>