【发布时间】:2021-03-02 23:48:08
【问题描述】:
我在寻找使迭代函数成为递归函数的方法时遇到了这个问题。
它是关于一个链表,这个链表存储“收藏”的视频,每个视频都有一个声音,我们要统计所有包含指定声音的视频。
链表元素如下所示:
typedef struct {
tVideo video;
} tFavorite;
// Data type to hold data related to a video in the platform
typedef struct tNode {
tFavorite e;
struct tNode *next;
} tFavoriteStackNode;
// Definition of a stack of favorites
typedef struct {
tFavoriteStackNode *first;
} tFavoriteStack;
而且 tVideo 有声音 (video.sound)。
现在,迭代函数是这样的:
unsigned favoriteStack_getFavoritesPerSoundRecursive(tFavoriteStack *stack, tSound *sound){
// PR2 EX3
assert(stack != NULL);
tFavoriteStackNode *tmp = (tFavoriteStackNode*)malloc(sizeof(tFavoriteStackNode));
static int cont = 0;
if (favoriteStack_empty(*stack)) {
return cont;
}
else {
tmp = stack->first;
while (tmp != NULL) {
if (tmp->e.video.sound != NULL){
if (sound_equals(sound, tmp->e.video.sound)){
cont++;
}
}
tmp = tmp->next;
}
}
return cont;
}
在这种情况下,我们做一个while循环,每次都将节点更改为下一个。
(请注意,if (tmp->e.video.sound != NULL) 被调用是因为 sound_equals() 中的断言)
所以我的问题是如何将这个函数变成递归函数?
提前致谢,
琼·弗雷克斯
【问题讨论】:
-
使其(尾)递归涉及确定当前条目是否匹配,如果不在列表中的下一项上递归调用该函数,则返回该递归调用的状态。您需要决定返回什么;列表的计数是不寻常的。
-
递归解决方案需要将第一个
tNode传递给函数,然后在递归调用中将下一个节点传递给同一函数。您还需要一个基本条件来决定何时停止递归。