如何通过[重复]迭代此代码10次

问题描述 投票:0回答:1

这是问题:

编写尾递归函数,将两个非负整数P和k作为输入,并输出具有初始总体P的人口的前10年的列表,并且每年将人口乘以k。如果需要,您的函数可以有辅助变量。

我试图让代码形成一个包含十个数字的列表。我假设数字的输入将是10.我试图朝着使基本情况为空而不是0的方向。有人对如何修复此代码或使其更好有任何建议吗?

(define (pop2 P k number)
 (cond
   [(= number 0) '()]
   [else
   (append (pop2 k (* P k)(- number 1)(list P)))]))
recursion racket tail-recursion
1个回答
1
投票
  1. 如果在递归调用之后不需要执行任何操作,则递归函数定义是尾递归的。但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(因为它保持不变)。

© www.soinside.com 2019 - 2024. All rights reserved.