如何通过10次迭代此代码

时间:2019-04-15 03:16:28

标签: recursion racket tail-recursion

这是问题:

  

编写一个尾递归函数,该函数将两个非负整数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)))]))

1 个答案:

答案 0 :(得分:1)

  1. 如果在递归调用后无需执行任何操作,则递归函数定义为 tail-recursive 。但是pop2在递归调用周围有append!为确保该函数返回的值与递归调用返回的值完全相同,该函数使用函数的一个额外参数(累加器)来跟踪结果。

  2. 在递归调用中,参数与它们的相应含义不匹配,并且还存在一个额外的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>